Redis scan count: comment forcer SCAN pour retourner toutes les clés correspondant à un motif?
j'essaie de trouver des valeurs stockées dans une liste de clés qui correspondent à un motif de redis. J'ai essayé d'utiliser <!-Pour que plus tard je puisse utiliser MGET
pour obtenir toutes les valeurs, Le problème est:
SCAN 0 MATCH "foo:bar:*" COUNT 1000
ne renvoie aucune valeur alors que
SCAN 0 MATCH "foo:bar:*" COUNT 10000
renvoie les touches désirées.
Comment puis-je la force SCAN
à regarder à travers toutes les clés existantes? Dois-je regarder en lua pour cela?
2 réponses
avec le code ci-dessous vous scannerez le premier objet 1000 à partir du curseur 0
SCAN 0 MATCH "foo:bar:*" COUNT 1000
dans le résultat vous obtiendrez un nouveau curseur à rappeler
SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000
scan 1000 à côté de l'objet. Ensuite, lorsque vous inscr ease compter de 1000 à 1000 et de récupérer des données, vous numérisez plus de clés, puis dans votre cas correspondent plus de clés.
pour numériser la liste entière, vous devez vous rappeler de numériser jusqu'à ce que le curseur renvoie zéro (I. e entier)--4-->
utilisez la commande INFO pour obtenir le montant de vos clés comme
db0: keys=YOUR_AMOUNT_OF_KEYS, expires=0, avg_ttl=0
alors appelez
SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS
Simplement de mettre cette ici pour quiconque s'intéresse à comment le faire en utilisant le python redis
bibliothèque:
import redis
redis_server = redis.StrictRedis(host=settings.redis_ip, port=6379, db=0)
mid_results = []
cur, results = redis_server.scan(0,'foo:bar:*',1000)
mid_results += results
while cur != 0:
cur, results = redis_server.scan(cur,'foo:bar:*',1000)
mid_results += results
final_uniq_results = set(mid_results)
Il m'a fallu quelques jours pour comprendre cela, mais, fondamentalement, chaque scan
retour d'un n-uplet.
Exemples:
(cursor, results_list)
(5433L, [... keys here ...])
(3244L, [... keys here, maybe ...])
(6543L, [... keys here, duplicates maybe too ...])
(0L, [... last items here ...])
- Conserver à balayage
cursor
jusqu'à0
. - Il y a une garantie, elle sera de retour à l'
0
. - même si le scan renvoie un < vide!--7--> entre scannez.
j'ai eu du mal à comprendre ce qu'était le numéro du curseur et pourquoi j'aurais au hasard une liste vide, ou des items répétés, mais même si je savais que j'avais juste mis des items.
Après la lecture:
cela avait plus de sens, mais il y a encore de la magie de programmation profonde et des compromis qui se produisent pour itérer les ensembles.