sql >> Database >  >> NoSQL >> Redis

Krijg alle sleutels in de Redis-database met python

Gebruik scan_iter()

scan_iter() is superieur aan keys() voor grote aantallen sleutels omdat het u een iterator geeft die u kunt gebruiken in plaats van te proberen alle sleutels in het geheugen te laden.

Ik had een record van 1B in mijn redis en ik kon nooit genoeg geheugen krijgen om alle sleutels tegelijk terug te geven.

EEN VOOR EEN TOETSEN SCANNEN

Hier is een python-fragment met scan_iter() om alle sleutels uit de winkel te halen die overeenkomen met een patroon en ze een voor een te verwijderen:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
    # delete the key
    r.delete(key)

SCANNEN IN BATCHES

Als u een zeer grote lijst met sleutels moet scannen - bijvoorbeeld groter dan>100k sleutels - is het efficiënter om ze in batches te scannen, zoals deze:

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)

Ik heb dit script gebenchmarkt en ontdekte dat het gebruik van een batchgrootte van 500 5 keer sneller was dan het één voor één scannen van sleutels. Ik heb verschillende batchgroottes (3.50.500.1000.5000) getest en ontdekte dat een batchgrootte van 500 optimaal lijkt.

Merk op dat of u de scan_iter() of keys() methode, de operatie is niet atomair en kan halverwege mislukken.

VERMIJD ZEKER HET GEBRUIK VAN XARGS OP DE OPDRACHTLIJN

Ik raad dit voorbeeld dat ik elders heb gevonden niet aan. Het zal mislukken voor unicode-sleutels en is ongelooflijk traag voor zelfs een matig aantal sleutels:

redis-cli --raw keys "user:*"| xargs redis-cli del

In dit voorbeeld maakt xargs een nieuw redis-cli-proces voor elke toets! dat is slecht.

Ik heb deze aanpak gebenchmarkt om 4 keer langzamer te zijn dan het eerste Python-voorbeeld waarbij het elke sleutel één voor één verwijderde en 20 keer langzamer dan het verwijderen in batches van 500.



  1. Resultaten beperken in MongoDB maar toch de volledige telling krijgen?

  2. Een gids voor het configureren van een load balancer in een MongoDB Sharded-cluster

  3. Abonneren op Meteor.Users Collection

  4. Bereikquery voor MongoDB-paginering