Brug scan_iter()
scan_iter()
er bedre end keys()
for et stort antal nøgler, fordi det giver dig en iterator, du kan bruge i stedet for at prøve at indlæse alle nøglerne i hukommelsen.
Jeg havde en 1B records i mit redis, og jeg kunne aldrig få nok hukommelse til at returnere alle nøglerne på én gang.
SCANNING AF NØGLER ÉN FOR EN
Her er et python-uddrag, der bruger scan_iter()
for at få alle nøgler fra butikken, der matcher et mønster, og slette dem én efter én:
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 BATCHES
Hvis du har en meget stor liste over nøgler, der skal scannes - for eksempel større end>100.000 nøgler - vil det være mere effektivt at scanne dem i batches, som denne:
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)
Jeg benchmarkerede dette script og fandt ud af, at det var 5 gange hurtigere at bruge en batchstørrelse på 500 end at scanne nøgler én efter én. Jeg testede forskellige batchstørrelser (3,50,500,1000,5000) og fandt ud af, at en batchstørrelse på 500 ser ud til at være optimal.
Bemærk, at uanset om du bruger scan_iter()
eller keys()
metoden er operationen ikke atomær og kan mislykkes halvvejs.
UNDGÅ BESTEMT AT BRUGE XARGS PÅ KOMMANDO-LINIEN
Jeg anbefaler ikke dette eksempel, jeg fandt gentaget andre steder. Det vil mislykkes for unicode-nøgler og er utroligt langsomt for selv moderate antal nøgler:
redis-cli --raw keys "user:*"| xargs redis-cli del
I dette eksempel opretter xargs en ny redis-cli-proces for hver tast! det er slemt.
Jeg benchmarkerede denne tilgang til at være 4 gange langsommere end det første python-eksempel, hvor den slettede hver nøgle én efter én og 20 gange langsommere end sletning i batches på 500.