IMPORTANT : utilisez toujours SCAN
au lieu de (le mal ) KEYS
La correspondance de modèle de Redis est quelque peu fonctionnellement limitée (voir l'implémentation de stringmatchlen
dans util.c) et ne fournit pas ce que vous cherchez ATM. Cela dit, considérez les itinéraires possibles suivants :
- Étendre
stringmatchlen
pour répondre à vos besoins, éventuellement en le soumettant en tant que PR. - Pensez à ce que vous essayez de faire :la récupération d'un sous-ensemble de clés sera toujours inefficace à moins que vous ne les indexiez. Envisagez plutôt de suivre les noms de toutes les clés non utilisateur (par exemple, dans un ensemble Redis). >
- Si vous insistez vraiment pour scanner l'ensemble de l'espace de clés et faire correspondre les modèles négatifs, une façon d'y parvenir est d'utiliser un peu de magie Lua.
Considérez l'ensemble de données et le script suivants :
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> set user:1 1
OK
127.0.0.1:6379> set use:the:force luke
OK
127.0.0.1:6379> set non:user a
OK
Lua (enregistrez-le sous scanregex.lua
):
local re = ARGV[1]
local nt = ARGV[2]
local cur = 0
local rep = {}
local tmp
if not re then
re = ".*"
end
repeat
tmp = redis.call("SCAN", cur, "MATCH", "*")
cur = tonumber(tmp[1])
if tmp[2] then
for k, v in pairs(tmp[2]) do
local fi = v:find(re)
if (fi and not nt) or (not fi and nt) then
rep[#rep+1] = v
end
end
end
until cur == 0
return rep
Sortie - première correspondance régulière, deuxième fois le complément :
[email protected]:~$ redis-cli --eval scanregex.lua , "^user"
1) "user:1"
[email protected]:~$ redis-cli --eval scanregex.lua , "^user" 1
1) "use:the:force"
2) "non:user"