redis - 如何获取与redis中特定模式不匹配的键?

标签 redis

在 Redis 中,keys user* 将打印所有以 user 开头的键。 例如:

keys user*
1) "user2"
2) "user1"

现在,我想要打印所有不以 user 开头的键。 我怎么能那样做?

最佳答案

重要:始终使用SCAN 而不是(邪恶)KEYS
do not use <code>KEYS</code>

Redis 的模式匹配在功能上有些受限(参见 util.cstringmatchlen 的实现)并且不提供您寻求 ATM 的内容。也就是说,请考虑以下可能的路线:

  1. 扩展 stringmatchlen 以满足您的要求,可能会将其作为 PR 提交。
  2. 考虑您要尝试做的事情 - 获取键的子集总是效率低下,除非您为它们建立索引,考虑改为跟踪所有非用户键的名称(例如,在 Redis 集中)。
  3. 如果您真的坚持要扫描整个键空间并与否定模式进行匹配,实现这一点的一种方法是使用一点 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/

相关文章:

php - Redis:KEYS * 的结果是如何排序的?

javascript - Node.js redis pub/sub 丢失消息

Azure Redis 缓存主机

redis - 通过cli获取redis hash数据

redis - Redis 中的键丢失

spring-boot - springboot2.0中使用@cacheable时如何为每个redis缓存配置不同的ttl

redis - key 条件更新的惯用方法

c# - Redis 声明标记为 DataContract 的类不可序列化?

sql - 当 json 数据格式的 redis.key-prefix-schema-table=true 时,redis presto 连接器损坏键

redis - 两个应用共享一个 Redis。如何防止缓存冲突?