sql >> Databasteknik >  >> NoSQL >> Redis

Få alla nycklar i Redis-databasen med python

Använd scan_iter()

scan_iter() är överlägsen keys() för ett stort antal nycklar eftersom det ger dig en iterator som du kan använda istället för att försöka ladda alla nycklar i minnet.

Jag hade en 1B-post i min redis och jag kunde aldrig få tillräckligt med minne för att returnera alla nycklar på en gång.

SCANNA NYCKLAR EN I FÖRENA

Här är ett python-utdrag som använder scan_iter() för att få alla nycklar från butiken som matchar ett mönster och radera dem en i taget:

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 BATCHER

Om du har en mycket stor lista med nycklar att skanna - till exempel större än>100 000 nycklar - kommer det att vara mer effektivt att skanna dem i omgångar, så här:

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)

Jag jämförde det här skriptet och fann att det var 5 gånger snabbare att använda en batchstorlek på 500 än att skanna nycklar en i taget. Jag testade olika batchstorlekar (3,50,500,1000,5000) och fann att en batchstorlek på 500 verkar vara optimal.

Observera att om du använder scan_iter() eller keys() metoden är operationen inte atomär och kan misslyckas halvvägs igenom.

UNDVIK DEFINITIVT ATT ANVÄNDA XARGS PÅ COMMAND-LINE

Jag rekommenderar inte det här exemplet som jag hittade upprepat någon annanstans. Det kommer att misslyckas för unicode-nycklar och är otroligt långsamt för även måttliga antal nycklar:

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

I det här exemplet skapar xargs en ny redis-cli-process för varje tangent! det är dåligt.

Jag jämförde detta tillvägagångssätt till att vara 4 gånger långsammare än det första pythonexemplet där det raderade varje tangent en i taget och 20 gånger långsammare än att radera i batcher om 500.



  1. Får du ett anslutningsfel när du använder redis-trib.rb för att skapa ett kluster?

  2. MongoDB $summa och $avg av underdokument

  3. Twisted:varför är det så att om du skickar en uppskjuten återuppringning till en uppskjuten tråd så blockeras tråden helt plötsligt?

  4. MongoDB findOneAndReplace()