Använd scan_iter()
scan_iter()
är överlägsen keys()
för ett stort antal nycklar eftersom det ger dig en iterator som du kan använda istället för att försöka ladda alla nycklar i minnet.
Jag hade en 1B-post i min redis och jag kunde aldrig få tillräckligt med minne för att returnera alla nycklar på en gång.
SCANNA NYCKLAR EN I FÖRENA
Här är ett python-utdrag som använder scan_iter()
för att få alla nycklar från butiken som matchar ett mönster och radera dem en i taget:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
SCANNING I BATCHER
Om du har en mycket stor lista med nycklar att skanna - till exempel större än>100 000 nycklar - kommer det att vara mer effektivt att skanna dem i omgångar, så här:
import redis
from itertools import izip_longest
r = redis.StrictRedis(host='localhost', port=6379, db=0)
# iterate a list in batches of size n
def batcher(iterable, n):
args = [iter(iterable)] * n
return izip_longest(*args)
# in batches of 500 delete keys matching user:*
for keybatch in batcher(r.scan_iter('user:*'),500):
r.delete(*keybatch)
Jag jämförde det här skriptet och fann att det var 5 gånger snabbare att använda en batchstorlek på 500 än att skanna nycklar en i taget. Jag testade olika batchstorlekar (3,50,500,1000,5000) och fann att en batchstorlek på 500 verkar vara optimal.
Observera att om du använder scan_iter()
eller keys()
metoden är operationen inte atomär och kan misslyckas halvvägs igenom.
UNDVIK DEFINITIVT ATT ANVÄNDA XARGS PÅ COMMAND-LINE
Jag rekommenderar inte det här exemplet som jag hittade upprepat någon annanstans. Det kommer att misslyckas för unicode-nycklar och är otroligt långsamt för även måttliga antal nycklar:
redis-cli --raw keys "user:*"| xargs redis-cli del
I det här exemplet skapar xargs en ny redis-cli-process för varje tangent! det är dåligt.
Jag jämförde detta tillvägagångssätt till att vara 4 gånger långsammare än det första pythonexemplet där det raderade varje tangent en i taget och 20 gånger långsammare än att radera i batcher om 500.