Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Uzyskaj wszystkie klucze w bazie danych Redis za pomocą Pythona

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Suszenie generycznego RedisTemplate na wiosnę 4

  2. Kiedy wyłączyć przezroczyste ogromne strony dla redis

  3. moje klucze redis nie wygasają

  4. Przykłady użycia RedisStore w socket.io

  5. Przełączanie awaryjne klastra