Użyj scan_iter()
scan_iter()
jest lepszy od keys()
dla dużej liczby kluczy, ponieważ daje iterator, którego możesz użyć zamiast próbować załadować wszystkie klucze do pamięci.
W moim redisie miałem rekordy 1B i nigdy nie mogłem zdobyć wystarczającej ilości pamięci, aby zwrócić wszystkie klucze naraz.
SKANOWANIE KLUCZY POJEDYNCZYCH
Oto fragment kodu Pythona za pomocą scan_iter()
aby pobrać wszystkie klucze ze sklepu pasujące do wzoru i usunąć je jeden po drugim:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
Skanowanie partiami
Jeśli masz bardzo dużą listę kluczy do przeskanowania – na przykład większą niż>100 tys. kluczy – bardziej efektywne będzie skanowanie ich partiami, w ten sposób:
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)
Przetestowałem ten skrypt i stwierdziłem, że użycie partii o wielkości 500 było 5 razy szybsze niż skanowanie kluczy jeden po drugim. Przetestowałem różne wielkości partii (3,50,500,1000,5000) i stwierdziłem, że wielkość partii 500 wydaje się być optymalna.
Zwróć uwagę, że niezależnie od tego, czy używasz scan_iter()
lub keys()
metoda, operacja nie jest niepodzielna i może zakończyć się niepowodzeniem.
ZDECYDOWANIE UNIKAJ UŻYWANIA XARGS W WIERSZU POLECEŃ
Nie polecam tego przykładu, który znalazłem powtórzony gdzie indziej. Nie powiedzie się dla klawiszy Unicode i jest niesamowicie powolny nawet dla średniej liczby klawiszy:
redis-cli --raw keys "user:*"| xargs redis-cli del
W tym przykładzie xargs tworzy nowy proces redis-cli dla każdego klucza! to źle.
Porównałem to podejście, aby było 4 razy wolniejsze niż w pierwszym przykładzie Pythona, w którym usuwało każdy klucz jeden po drugim i 20 razy wolniej niż usuwanie w partiach po 500.