sql >> Databáze >  >> NoSQL >> Redis

jak získat klíče, které neodpovídají konkrétnímu vzoru v redis?

DŮLEŽITÉ: vždy používejte SCAN místo (zlo ) KEYS

Porovnání vzorů Redis je poněkud funkčně omezené (viz implementace stringmatchlen v util.c) a neposkytuje to, co hledáte ATM. To znamená, že zvažte následující možné cesty:

  1. Rozšířit stringmatchlen aby odpovídal vašim požadavkům, případně jej odešlete jako PR.
  2. Zvažte, co se snažíte udělat – načítání podmnožiny klíčů bude vždy neefektivní, pokud je neindexujete, zvažte místo toho sledování názvů všech neuživatelských klíčů (tj. např. v sadě Redis).
  3. Pokud opravdu trváte na skenování celého klíčového prostoru a porovnání s negativními vzory, jedním ze způsobů, jak toho dosáhnout, je trocha magie Lua.

Zvažte následující datovou sadu a skript:

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 (uložte si to jako 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

Výstup - poprvé pravidelná shoda, podruhé doplněk:

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


  1. jarní relace redis 'Není definována žádná bean s názvem 'springSessionRepositoryFilter'

  2. Jak spustím Mongo DB z Windows?

  3. nemůže zabít redis-server na linuxu

  4. Automatické zálohování MongoDB