重要: 常にSCAN
を使用してください (悪の代わりに )KEYS
Redisのパターンマッチングは機能的に多少制限されています(stringmatchlen
の実装を参照してください) util.c)で、ATMを求めるものを提供しません。そうは言っても、次の可能なルートを検討してください。
-
stringmatchlen
を拡張します 要件に合わせて、PRとして提出することもできます。 - 何をしようとしているのかを考えてください。キーのサブセットをフェッチすることは、インデックスを作成しない限り常に非効率になります。代わりに、すべての非ユーザーキーの名前を追跡することを検討してください(Redisセットなど)。 >
- キースペース全体をスキャンしてネガティブパターンと照合することに固執している場合、それを実現する1つの方法は、Luaの魔法を少し使用することです。
次のデータセットとスクリプトを検討してください。
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(これを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
出力-1回目は通常のマッチング、2回目は補数:
[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"