当前位置: 首页 > 面试题库 >

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

燕刚毅
2023-03-14
问题内容

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

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

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

任何建议将不胜感激。


问题答案:

下面的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测试)



 类似资料:
  • 我想在命令行上这样做,所以像这样的事情会很好: 上面的方法当然不适合散列。所以最后我需要打电话 以自动化的方式。

  • hdel key field 删除指定的hash field

  • 在许多Redis教程中(比如本教程),数据存储在一个集合中,但多个值组合在一个字符串中(即,用户帐户可以作为两个条目“user:1000:username”和“user:1000:password”存储在集合中)。 然而,Redis也有哈希。似乎拥有一个“user:1000”散列会更有意义,它包含一个“username”条目和一个“password”条目。您只需直接在哈希中访问它们,而不是连接字符

  • 哈希是键/值对 如果你想按名字查询,那么需要哈希。哈希的键必须唯一,但值可以是任意标量。 有时候你仍然会看到人们称它为“关联数组”,但不要想当然的把它作为数组。 通过键/值对列表来创建哈希 使用键/值对列表创建哈希: my %stooges = ( 'Moe', 'Howard', 'Larry', 'Fine', 'Curly', 'Howard', 'Iggy'

  • 问题内容: 我要在我的一个项目中对分页进行ajax化,并且由于我希望用户能够为当前页面添加书签,因此我通过哈希附加页面编号,例如: 并且多数民众赞成在它工作正常,一切,除了,当页码为1时,我不想成为,我只是希望它成为 我尝试了以下变体: 的作品,但网址现在就像,我不很哈希那里。 根本不使用window.location.hash,但是当用户从第3页回到第1页时,他位于第1页,但是url仍然是因为我

  • 问题内容: 在许多Redis教程(例如this)中,数据存储在一个集合中,但是多个值组合在一个字符串中(即,一个用户帐户可能作为两个条目存储在集合中,“ user:1000:username”和“用户:1000:密码”)。 但是,Redis也有哈希值。似乎更有意义的是使用“ user:1000”散列,其中包含“ username”条目和“ password”条目。无需将字符串串联以访问特定值,您只