我需要能够将成员放在已排序集合中给定成员的左侧和右侧。
例如:
["red", "green", "blue", "yellow", "black"]
如果我要求" blue"左边和右边的成员我需要回来"绿色"和"黄色"。
我可以做的一种方法是使用zrank
来获取成员的索引(让我们称之为x)为蓝色(2),然后使用zrange
和{{ x = 1的1}}和x + 1的start
。
问题:它不是原子的。如果在两个步骤(zrank和zrange)之间删除索引< = x的成员,则索引将不匹配,并且将返回错误的成员。
有没有原子方法可以做到这一点?
答案 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是有序集合中的成员。