sql >> Databasteknik >  >> NoSQL >> Redis

hur får man nycklar som inte matchar ett visst mönster i redis?

VIKTIGT: använd alltid SCAN istället för (det ondska ) KEYS

Redis mönstermatchning är något funktionellt begränsad (se implementeringen av stringmatchlen i util.c) och tillhandahåller inte det som du söker ATM. Som sagt, överväg följande möjliga rutter:

  1. Utöka stringmatchlen för att matcha dina krav, eventuellt skicka in det som en PR.
  2. Tänk på vad du försöker göra – att hämta en delmängd av nycklar kommer alltid att vara ineffektivt om du inte indexerar dem, överväg att spåra namnen på alla icke-användarnycklar (t.ex. i en Redis Set) istället.
  3. Om du verkligen insisterar på att skanna hela tangentutrymmet och matcha mot negativa mönster, är ett sätt att åstadkomma det med lite Lua-magi.

Tänk på följande datauppsättning och 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 (spara detta som 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 - första gången regelbunden matchning, andra gången komplementet:

[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. Att uppdatera sökvägen 'x' skulle skapa en konflikt vid 'x'

  2. Stackfönstret visar ingen utdata vid felsökning av Redis Lua-skript med ZeroBrane

  3. hur man strukturerar ett sammansatt index i mongodb

  4. I NodeJS, hur matar man ut resultat från mongodb med olika fältnamn?