hier ein voll ist Arbeitsbeispiel mit py-redis:
from redis import StrictRedis
cache = StrictRedis()
def clear_ns(ns):
"""
Clears a namespace
:param ns: str, namespace i.e your:prefix
:return: int, cleared keys
"""
count = 0
ns_keys = ns + '*'
for key in cache.scan_iter(ns_keys):
cache.delete(key)
count += 1
return count
Sie auch scan_iter
tun können, alle Schlüssel zu bekommen in den Speicher, und übergeben Sie dann alle Schlüssel an delete
für eine Massenlöschung, aber kann einen großen Teil des Speichers für größere Namespaces nehmen. Also am besten einen delete
für jeden Schlüssel ausführen.
Prost!
UPDATE:
Da die Antwort zu schreiben, begann ich Pipeliningfunktion von redis unter Verwendung aller Befehle in einer Anfrage zu senden und Netzwerk-Latenz zu vermeiden:
from redis import StrictRedis
cache = StrictRedis()
def clear_cache_ns(ns):
"""
Clears a namespace in redis cache.
This may be very time consuming.
:param ns: str, namespace i.e your:prefix*
:return: int, num cleared keys
"""
count = 0
pipe = cache.pipeline()
for key in cache.scan_iter(ns_keys):
pipe.delete(key)
count += 1
pipe.execute()
return count
UPDATE2 (Beste Leistung):
Wenn Sie scan
anstelle von scan_iter
verwenden, können Sie die Chunk-Größe steuern und mit der eigenen Logik durch den Cursor iterieren. Dies scheint auch viel schneller zu sein, besonders wenn es um viele Schlüssel geht. Wenn Sie Pipelining hinzufügen, erhalten Sie eine Leistungssteigerung von 10-25%, abhängig von der Chunk-Größe, auf Kosten der Speichernutzung, da Sie den Ausführungsbefehl erst dann an Redis senden, wenn alles generiert ist. Also steckte ich mit Scan:
from redis import StrictRedis
cache = StrictRedis()
CHUNK_SIZE = 5000
def clear_ns(ns):
"""
Clears a namespace
:param ns: str, namespace i.e your:prefix
:return: int, cleared keys
"""
cursor = '0'
ns_keys = ns + '*'
while cursor != 0::
cursor, keys = cache.scan(cursor=cursor, match=ns_keys, count=CHUNK_SIZE)
if keys:
cache.delete(*keys)
return True
Hier sind einige Benchmarks:
5k chunks ein Besetzt Redis Cluster mit: Done removing using scan in 4.49929285049 Done removing using scan_iter in 98.4856731892 Done removing using scan_iter & pipe in 66.8833789825 Done removing using scan & pipe in 3.20298910141
5k Brocken und eine kleine Ruhe dev redis (localhost): Done removing using scan in 1.26654982567 Done removing using scan_iter in 13.5976779461 Done removing using scan_iter & pipe in 4.66061878204 Done removing using scan & pipe in 1.13942599297
redis-Python-Paket verwenden Sie, dass eine solche Art und Weise tun: 'cache.delete (* Tasten)' – selfnamed