gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:00:35 25 4
gpt4 key购买 nike

与此类似,但需要哈希而不是纯键的解决方案:How to atomically delete keys matching a pattern using Redis

我有一堆带有前缀的哈希:“前缀:”

在每个散列下面是一堆键,例如:“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 一段时间。原子性是有代价的。

更新:

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

关于lua - 根据哈希键名批量删除redis哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17224817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com