【发布时间】:2016-04-12 09:02:42
【问题描述】:
我有一个使用 redis 排序集的队列系统。我的 lua 脚本如下所示:
local moveElement = function(source, dest , score, destscore)
local element = redis.pcall('ZRANGEBYSCORE', source, '-inf',score, 'WITHSCORES' , 'LIMIT' , '0' , '1')
if element ~= false and #element ~= 0 then
redis.call('ZADD' , dest , destscore , element[1])
redis.call('ZREM' , source , element[1])
end
end
local temp = moveElement(KEYS[2], KEYS[1] , ARGV[2])
local temp = moveElement(KEYS[3], KEYS[1] , ARGV[2])
local score= redis.call('ZRANGEBYSCORE', KEYS[1], '-inf',ARGV[1], 'WITHSCORES' , 'LIMIT' , '0' , '10')
if score ~= false and #score ~= 0 then
local i = 1
while i<=#score do
redis.call('ZREM', KEYS[1] , score[i])
redis.call('ZREM', KEYS[2] , score[i])
redis.call('ZADD', KEYS[3], ARGV[1] , score[i])
i=i+2
end
end
return score
这个 lua 脚本需要 24 秒,排序集中有 6K 成员。
SLOWLOG GET 10
1) 1) (integer) 5937
2) (integer) 1385993558
3) (integer) 24446
4) 1) "EVAL"
2) "local moveElement = function(source, dest , score, destscore) local element = redis.pcall('ZRANGEBYSCORE', sourc... (937 more bytes)"
我的代码做法是:
我用以下参数调用这个脚本。
- [键数]
- foo1 排序集名称有 6k。
- foo2 排序集名称。
- foo3 排序集。将成员从 foo1 移动到 foo2 的位置。
- 当前时间戳。
- 当前时间戳 - 6 分钟。
有没有办法优化时间?通过缓存 lau 脚本什么的?
因为我总是使用 ZRANGE 帮助代替 ZRANGEBYSCORE 从低到高获取价值?
更多详情:
我正在尝试实现某种类型的队列系统。逻辑在这里:
- foo1 包含具有分数作为时间戳的成员,在该成员 需要被解雇。
- 将来需要触发事件时。它被放入 foo1 中,得分为调度时间。
- 我的脚本从 foo1 读取分数小于或等于当前时间戳的所有成员(一个接一个)并将它们移动到 foo3。这是一一完成的,并且元素被移动。这个元素被分配给分配给一些工人。 (隐藏)
- 如果工人完成工作。它从 foo3 中删除成员。
- 如果成员未删除 foo3,则在 x 秒超时后。脚本将其移回 foo1。所以它可以重新分配给其他工人。
【问题讨论】: