在排序集中获取成员的左右两侧

时间:2015-10-23 11:29:57

标签: redis

我需要能够将成员放在已排序集合中给定成员的左侧和右侧。

例如:

["red", "green", "blue", "yellow", "black"]

如果我要求" blue"左边和右边的成员我需要回来"绿色"和"黄色"。

我可以做的一种方法是使用zrank来获取成员的索引(让我们称之为x)为蓝色(2),然后使用zrange和{{ x = 1的1}}和x + 1的start

问题:它不是原子的。如果在两个步骤(zrank和zrange)之间删除索引< = x的成员,则索引将不匹配,并且将返回错误的成员。

有没有原子方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

使用LUA脚本。类似的东西:

local rank = redis.call('zrank', KEYS[1], ARGV[1]);
if rank == nil then
    return nil
end  

if rank == 0 then
    return redis.call('zrange', KEYS[1], rank, rank + 1); 
end

return redis.call('zrange', KEYS[1], rank - 1, rank + 1); 

第一个arg是你的有序集合键,第二个arg是有序集合中的成员。