![](/img/trans.png)
[英]Using the redis ruby gem, how do I clear a set of keys from redis matching a pattern?
[英]how to delete key from list in redis matching a pattern?
使用Ruby Redis客户端
我有一个键,其中包含一个值列表,它们遵循以下模式
campaign_id|telephone|query_id
在单个列表中有成千上万个这样的列表,我想要做的就是从该Redis列表中删除所有具有例如query_id为4的列表。 您可以通过某种模式匹配来做到这一点吗? 请问有人可以给我一个例子,因为我一直在阅读其他问题,有点迷路
基本上,您有两个选择之一:a)在您的(RoR)应用程序中执行,或b)在Redis中执行。
我不是RoR专家,所以我不提供建议,但请注意,采用a)路径基本上是将整个列表移至应用程序,然后进行过滤。 您的列表越大,通过网络花费的时间就越多。
选项b)意味着您将在Redis中过滤列表-使用Lua可以轻松而有效地完成此操作。 例:
$ cat dellistbyqueryid.lua
-- removes a range of list elements that confirm to a given
-- query_id. Elements are stored as: 'campaign_id|telephone|query_id'
-- KEYS[1] - a list
-- ARGV[1] - a query_id
-- return: number of elements removed
local l = tonumber(redis.call('LLEN', KEYS[1]))
local n = 0
while l > 0 do
local curr = redis.call('LINDEX', KEYS[1], -1)
local id = curr:match( '.*|.*|(.*)' )
if id == ARGV[1] then
redis.call('RPOP', KEYS[1])
n = n + 1
else
redis.call('RPOPLPUSH', KEYS[1], KEYS[1])
end
l = l - 1
end
return n
输出:
$ redis-cli LPUSH list "foo|bar|1" "baz|qaz|2" "lua|redis|1"
(integer) 3
$ redis-cli --eval dellistbyqueryid.lua list , 1
(integer) 2
$ redis-cli LRANGE list 0 -1
1) "baz|qaz|2"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.