Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 基于哈希键名称批量删除redis哈希值_Lua_Redis_Command Line Interface - Fatal编程技术网

Lua 基于哈希键名称批量删除redis哈希值

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

与此类似,但需要针对散列而不是普通键的解决方案:

我有一堆前缀为:“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) 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