Redis获得成员得分在最小和最大之间

时间:2015-08-24 15:19:18

标签: redis

我在sql中有一个包含3列的表:BIGINT StartNumber, BIGINT EndNumber, BIGINT LocationId,我需要能够做这样的事情

Select LocationId where StartNumber < @number and EndNumber > @number.

例如:

StartNumber EndNumber LocationId
1             5          1
6             9          1
10            16         2

当我有@number = 7时,我应该得到LocationId = 1

我怎样才能在redis中执行此操作?

我正在考虑将此表移至redis,使用有序集和ZRANGEBYSCORE但它对我不起作用: 1)当我使用ZADD键得分成员[得分] [成员]时,即使使用nx参数,我也无法添加具有相同成员和不同得分的2个元素: zadd myset nx 1 "17" 2 "17" - 它将添加一个元素,然后更新其分数,而不是添加两个元素。 2)当我添加这个:zadd set1 2 "a" 4 "b" 6 "c" 10 "d"然后尝试做zrangebyscore set1 3 3(想要获得其成绩包括3的成员)我得到空结果

P.S。所有命令都在redis网站的示例页面上执行。

1 个答案:

答案 0 :(得分:2)

换句话说,您的问题是&#34;如何将N个数字范围映射到某个位置&#34;。一种方法是使用两个排序集,一个用于StartNumber,另一个用于EndNumber。由于成员必须是唯一的,我们还需要通过将Start / End值用作成员的一部分来确保。例如,使用您的示例数据,可以这样做:

ZADD StartNumber 1 "1:5:1" 6 "6:9:1" 10 "10:16:2"
ZADD EndNumber 5 "1:5:1" 9 "6:9:1" 16 "10:16:2"

要查找@ number = 7的位置,请执行ZRANGEBYSCORE StartNumber -inf 7ZRANGEBYSCORE EndNumber 7 +inf并将结果相交。剩下的就是将冒号的结果拆分为冒号(:)并使用第3个元素作为位置。

注意:如果您的应用确保没有重叠的范围,并且每个&#34;数字&#34;只能有一个位置,则只能使用一组来获得相同的结果