在 Redis 中,keys user*
将打印所有以 user
开头的键。
例如:
keys user*
1) "user2"
2) "user1"
现在,我想要打印所有不以 user
开头的键。
我怎么能那样做?
最佳答案
重要:始终使用SCAN
而不是(邪恶)KEYS
Redis 的模式匹配在功能上有些受限(参见 util.c 中 stringmatchlen
的实现)并且不提供您寻求 ATM 的内容。也就是说,请考虑以下可能的路线:
- 扩展
stringmatchlen
以满足您的要求,可能会将其作为 PR 提交。 - 考虑您要尝试做的事情 - 获取键的子集总是效率低下,除非您为它们建立索引,考虑改为跟踪所有非用户键的名称(例如,在 Redis 集中)。
- 如果您真的坚持要扫描整个键空间并与否定模式进行匹配,实现这一点的一种方法是使用一点 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
输出——第一次正则匹配,第二次补码:
foo@bar:~$ redis-cli --eval scanregex.lua , "^user"
1) "user:1"
foo@bar:~$ redis-cli --eval scanregex.lua , "^user" 1
1) "use:the:force"
2) "non:user"
关于redis - 如何获取与redis中特定模式不匹配的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29942541/