Lua 基于哈希键名称批量删除redis哈希值
与此类似,但需要针对散列而不是普通键的解决方案: 我有一堆前缀为:“prefix:” 每个散列下都有一组键,如:“cc_XX”,其中“XX”是一个两个字母的代码 我需要一些how循环遍历我所有的redis散列,并删除每个cc_XX子键some how,我正在寻找一种cli/lua方法来实现这一点(两者都不太好) 如果您有任何建议,我们将不胜感激。以下内容可以满足您的要求:Lua 基于哈希键名称批量删除redis哈希值,lua,redis,command-line-interface,Lua,Redis,Command Line Interface,与此类似,但需要针对散列而不是普通键的解决方案: 我有一堆前缀为:“prefix:” 每个散列下都有一组键,如:“cc_XX”,其中“XX”是一个两个字母的代码 我需要一些how循环遍历我所有的redis散列,并删除每个cc_XX子键some how,我正在寻找一种cli/lua方法来实现这一点(两者都不太好) 如果您有任何建议,我们将不胜感激。以下内容可以满足您的要求: local keys = redis.call('KEYS',KEYS[1]) for i,k in ipairs(keys
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_..
(用bash测试)我们在Redis中存储散列的方式是,在散列中按对象类型为散列元素id键添加后缀。有时在数据模型中,我们更新一个对象,需要在部署时删除给定对象类型的所有哈希元素。我们希望在不删除整个散列的情况下实现这一点 例如:
127.0.0.1:6379> keys client*
1) "client"
127.0.0.1:6379> type client
hash
127.0.0.1:6379> hkeys client
1) "123-obj1"
2) "123-obj2"
3) "123-obj3"
4) "123-obj4"
5) "123-obj5"
6) "456-obj1"
7) "456-obj2"
8) "456-obj3"
9) "456-obj4"
10) "456-obj5"
如果我们在应用程序中向obj5添加一个新字段并设置一个默认值,我们将需要运行与“HDEL client*-obj5”等效的程序。但是,这在redis cli中不起作用
我通过BASH找到了以下作品:
redis-cli HKEYS 'client' | grep obj5 | awk '{ printf "HDEL client %s\n", $1 }' | redis-cli
如果在您的环境中使用不同的Redis数据库,请添加“-n X”开关,该开关相当于Redis cli中的“选择X”。在这种情况下,选择数据库4:
redis-cli -n 4 HKEYS 'client' | grep obj5 | awk '{ printf "HDEL client %s\n", $1 }' | redis-cli -n 4
我应该澄清一下,我不需要原子操作。有没有一种简单的方法可以让它在运行时允许其他呼叫通过?仅为了我的理解,脚本正在执行以下操作?对不起,我正在手机上写。。。我会试一试,试着理解你是如何/为什么这样写的。我可以向您发回另一个问题。:)我最后试了一下,它似乎删除了所有包含“cc_u3;”的内容,而不是所有以“cc_3;”开头的内容。例如,我试图删除所有这些“cc_XX”键,同时保留所有像“metadata_cc_XX”和“metadata_cc_XX”这样的新键,但它们在运行“cc_…”时都会被删除。任何建议都将不胜感激。啊哈,更多的正则表达式风格,我认为它只是一个通配符。谢谢
redis-cli -n 4 HKEYS 'client' | grep obj5 | awk '{ printf "HDEL client %s\n", $1 }' | redis-cli -n 4