我在 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/