sql >> Databáze >  >> NoSQL >> Redis

Získejte všechny klíče v databázi Redis pomocí pythonu

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.



  1. MongoDB na Ubuntu se nespustí jako služba, nic v protokolu

  2. MongoDB $add

  3. Použití nginx k poskytování obsahu přímo z mezipaměti redis

  4. Nejlepší způsob, jak hostovat MongoDB na DigitalOcean