小编典典

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

redis

我有一堆带有前缀的散列,例如:“ prefix:”

在每个哈希值下面是一堆键,例如:“ cc_XX”,其中“ XX”是2个字母的代码。

我需要一些如何遍历所有redis散列的方法,并删除每一个cc_XX子键的某些方法,并且正在寻找一种cli / lua方式来做到这一点(两者都不好)。

任何建议将不胜感激。


阅读 387

收藏
2020-06-20

共1个答案

小编典典

下面的EVAL脚本应执行所需的操作:

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一段时间。原子性是有代价的。

更新:

如果您不需要原子性,那么以下脚本将避免阻塞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测试)

2020-06-20