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

栏目: 数据库 · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/29942541/how-to-get-keys-which-does-not-match-a-particular-pattern-in-redis

Redis 中,键user *将打印以user开头的所有键.

例如:

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

现在,我想要打印所有不以用户开头的键.

我怎么能这样做?

重要提示:始终使用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"

翻译自:https://stackoverflow.com/questions/29942541/how-to-get-keys-which-does-not-match-a-particular-pattern-in-redis


以上所述就是小编给大家介绍的《如何获得与redis中特定模式不匹配的键?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客秘笈

黑客秘笈

[美]彼得·基姆 / 徐文博、成明遥 / 人民邮电出版社 / 2015-7-1 / 45.00

所谓的渗透测试,就是借助各种漏洞扫描工具,通过模拟黑客的攻击方法,来对网络安全进行评估。 本书采用大量真实案例和集邮帮助的建议讲解了在渗透测试期间会面临的一些障碍,以及相应的解决方法。本书共分为10章,其内容涵盖了本书所涉的攻击机器/工具的安装配置,网络扫描,漏洞利用,人工地查找和搜索Web应用程序的漏洞,攻陷系统后如何获取更重要的信息,社工方面的技巧,物理访问攻击,规避杀毒软件的方法,破解......一起来看看 《黑客秘笈》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具