Redis
 sql >> Database >  >> NoSQL >> Redis

come ottenere chiavi che non corrispondono a un modello particolare in redis?

IMPORTANTE: usa sempre SCAN invece di (il male ) KEYS

La corrispondenza dei modelli di Redis è in qualche modo limitata dal punto di vista funzionale (vedi l'implementazione di stringmatchlen in util.c) e non fornisce ciò che cerchi ATM. Detto questo, considera i seguenti possibili percorsi:

  1. Estendi stringmatchlen per soddisfare le tue esigenze, eventualmente presentandolo come PR.
  2. Considera cosa stai cercando di fare:recuperare un sottoinsieme di chiavi sarà sempre inefficiente a meno che non le indicizzi, considera invece di tenere traccia dei nomi di tutte le chiavi non utente (ad esempio in un Redis Set).
  3. Se sei davvero insistente nel scansionare l'intero spazio chiave e confrontarlo con schemi negativi, un modo per farlo è con un po' di magia Lua.

Considera il seguente set di dati e script:

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 (salvalo come 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

Output:prima corrispondenza regolare, seconda volta il complemento:

[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"