Redis
 sql >> Base de données >  >> NoSQL >> Redis

comment obtenir des clés qui ne correspondent pas à un modèle particulier dans redis ?

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 :

  1. Étendre stringmatchlen pour répondre à vos besoins, éventuellement en le soumettant en tant que PR.
  2. 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).
  3. >
  4. 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"