Použijte scan_iter()
scan_iter()
je lepší než keys()
pro velký počet klíčů, protože vám poskytuje iterátor, který můžete použít, místo abyste se snažili načíst všechny klíče do paměti.
Měl jsem v redis 1B záznamů a nikdy jsem nemohl získat dostatek paměti, abych mohl vrátit všechny klíče najednou.
SKENOVÁNÍ TLAČÍTEK PO JEDNOM
Zde je fragment pythonu pomocí scan_iter()
získat všechny klíče z obchodu odpovídající vzoru a jeden po druhém je odstranit:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
SKENOVÁNÍ V DÁVKÁCH
Pokud máte velmi velký seznam klíčů ke skenování – například větší než>100 000 klíčů – bude efektivnější skenovat je v dávkách, jako je tento:
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)
Testoval jsem tento skript a zjistil jsem, že použití velikosti dávky 500 bylo 5krát rychlejší než skenování klíčů jeden po druhém. Testoval jsem různé velikosti dávek (3,50,500,1000,5000) a zjistil jsem, že velikost dávky 500 se zdá být optimální.
Všimněte si, že ať už používáte scan_iter()
nebo keys()
způsob, operace není atomická a mohla by částečně selhat.
ROZHODNĚ SE VYHNĚTE POUŽÍVÁNÍ XARGS NA PŘÍKAZOVÉ ŘÁDCE
Nedoporučuji tento příklad, který se opakoval jinde. Selže pro klíče Unicode a je neuvěřitelně pomalý pro i střední počet klíčů:
redis-cli --raw keys "user:*"| xargs redis-cli del
V tomto příkladu xargs vytvoří nový proces redis-cli pro každý klíč! to je špatné.
Testoval jsem tento přístup tak, aby byl 4krát pomalejší než první příklad pythonu, kde se mazal každý klíč jeden po druhém, a 20krát pomalejší než mazání v dávkách po 500.