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?

15
demandé sur DarthSpeedious 2015-10-16 12:23:32

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
22
répondu khanou 2015-10-16 10:11:18

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.

12
répondu jmunsch 2016-09-11 09:31:40