如何从匹配模式的redis中删除列表中的键?

时间:2015-08-17 10:42:59

标签: ruby-on-rails ruby regex redis

使用ruby redis客户端

我有一个键,其中包含符合

模式的值列表
campaign_id|telephone|query_id

在单个列表中有数千个这样的我想要做的是从redis列表中删除所有具有例如query_id为4的那些。你能通过某种模式匹配来做到这一点吗?请有人给我一个例子,因为我一直在阅读其他问题并且有点迷失

1 个答案:

答案 0 :(得分:0)

您基本上有两种选择之一: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"