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:
- Udvid
stringmatchlen
for at matche dine krav, eventuelt indsende det som en PR. - 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). >
- 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"