繁体   English   中英

如何从与模式匹配的redis中的列表中删除密钥?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM