我在 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,使用 sorted set 和 ZRANGEBYSCORE 但它对我不起作用:
1) 当我使用 ZADD 关键分数成员 [score] [member] 时,即使使用 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的成员)我得到空结果

附言所有命令都在 redis 网站的示例页面上执行。

最佳答案

因此,正如我所理解的任务,您没有重叠,并且每个间隔仅映射到一个位置(?),并且间隔没有间隙。基于此,您只能使用一个具有下限(或上限)值的排序列表:

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

然后你可以使用:
ZREVRANGEBYSCORE StartNumber 7 -inf LIMIT 0 1

它将是 O(log(N))。

关于Redis 获取分数介于最小值和最大值之间的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32185898/

10-15 10:06