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
stringmatchlenpour 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 :
example@sqldat.com:~$ redis-cli --eval scanregex.lua , "^user"
1) "user:1"
example@sqldat.com:~$ redis-cli --eval scanregex.lua , "^user" 1
1) "use:the:force"
2) "non:user"