使用 Ruby Redis 客户端
我有一个包含值列表的键,它们遵循以下模式:
campaign_id|telephone|query_id
这里有一个包含成千上万个元素的列表,我想要做的是从Redis列表中删除所有查询ID为4的元素。是否可以通过某种模式匹配来实现呢?请问能否给出一个示例,因为我已经阅读了其他问题,但感到有些困惑。
使用 Ruby Redis 客户端
我有一个包含值列表的键,它们遵循以下模式:
campaign_id|telephone|query_id
这里有一个包含成千上万个元素的列表,我想要做的是从Redis列表中删除所有查询ID为4的元素。是否可以通过某种模式匹配来实现呢?请问能否给出一个示例,因为我已经阅读了其他问题,但感到有些困惑。
$ 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"
list.reject { |e| e =~ /|#{query_id}$/ }
- Aleksei Matiushkin