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

hvordan får man nøgler, der ikke matcher et bestemt mønster i redis?

VIGTIG: brug altid SCAN i stedet for (det onde ) KEYS

Redis' mønstertilpasning er noget funktionelt begrænset (se implementeringen af ​​stringmatchlen i util.c) og giver ikke det, du søger ATM. Når det er sagt, så overvej følgende mulige ruter:

  1. Udvid stringmatchlen for at matche dine krav, eventuelt indsende det som en PR.
  2. Overvej, hvad du forsøger at gøre - at hente et undersæt af nøgler vil altid være ineffektivt, medmindre du indekserer dem. Overvej i stedet at spore navnene på alle ikke-brugernøgler (f.eks. i et Redis-sæt).
  3. >
  4. Hvis du virkelig insisterer på at scanne hele tasterummet og matche mod negative mønstre, er en måde at opnå det på med en lille smule Lua-magi.

Overvej følgende datasæt og 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 (gem dette 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ørste gang regelmæssig matchning, 2. gang 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. hvad er pagecache, dentries, inoder?

  2. NodeJS og MongoDB applikationsgodkendelse af JWT

  3. MongoDB $loft

  4. Mongoose opdatering/upsert?