加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua – 根据哈希键名称批量删除redis哈希值

发布时间:2020-12-14 21:42:30 所属栏目:大数据 来源:网络整理
导读:与此类似,但需要哈希解决方案而不是普通键: How to atomically delete keys matching a pattern using Redis 我有一堆哈希,前缀如下:“prefix:” 在每个散列下都有一堆键,如:“cc_XX”,其中“XX”是2个字母的代码. 我需要一些循环遍历所有redis哈希值,并
与此类似,但需要哈希解决方案而不是普通键: How to atomically delete keys matching a pattern using Redis

我有一堆哈希,前缀如下:“prefix:”

在每个散列下都有一堆键,如:“cc_XX”,其中“XX”是2个字母的代码.

我需要一些循环遍历所有redis哈希值,并删除每个cc_XX子键的一些方法,并且我正在寻找一种cli / lua方法来做到这一点(两者都不是很好).

任何建议将不胜感激.

解决方法

以下 EVAL script应该做你想要的:

local keys = redis.call('KEYS',KEYS[1])
for i,k in ipairs(keys) do
    local res = redis.call('HKEYS',k)
    for j,v in ipairs(res) do
        if string.find(v,ARGV[1]) then
            redis.call('HDEL',k,v)
        end
    end
end

您需要通过提供以下参数来调用它:

EVAL <script> 1 prefix:* cc_..

请注意,它会阻止Redis事件循环,直到脚本完成,因此如果您有大量的密钥,它可以冻结Redis一段时间. Atomicity有一个价格.

更新:

如果你不需要原子性,那么下面的脚本将避免阻塞Redis太长时间(但是请注意,如果你有一个巨大的全局数量的键或者如果你的一个哈希对象是巨大的,它仍会阻塞:有没办法避免这种情况).

./redis-cli keys 'prefix:*' | awk '
BEGIN {
    script = "local res = redis.call('''HKEYS''',KEYS[1]); 
          for j,v in ipairs(res) do                          
            if string.find(v,ARGV[1]) then                   
              redis.call('''HDEL''',KEYS[1],v);            
            end                                              
          end"
}
{
    printf "EVAL "%s" 1 %s cc_..n",script,$1
}' | ./redis-cli

(用bash测试)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读