redis有值查询返回null_redis实现区间查询与查找某个值的范围

在实际开发中经常遇到这样需求:服务端对于客户端不同的版本区间会做些不同的配置,那么客户端一个版本过来怎么快速的定位是属于哪个版本区间呢?

小编告诉你答案:可以利用Sorted Sets的zrangebyscore命令。

19562a1ecf70796babb8c1716a72e3df.png

如上我们像myset里插入了4条数据,代表的意思是版本区间v1是从1011-1015版本,版本区间v2是从1018-1023版本。注:Redis的SortedSets需要score必须为float型,所以这里需要对版本号做一个等价的转换。那么我现在如何判断1014版本属于哪个区间呢,使用zrangebyscore如下操作:

dbf78539b4ea59a6fa41e6d591164212.png

返回v1_end说明1014属于版本区间1,上面的这个命令的意思是在myset中查找第一个score值大于等于1014的member,如果我们查找一个不在区间内的版本,比如1016:

97a38e4534162fbcf162b0066d47ff0f.png

返回v2_start说明它不已有的版本区间内。关于该命令的具体用法可以看这里这里。

不过这种用法不适合那些区间之间存在重叠的场景。

实现一个hash里不同的field拥有不同expire的场景

目前redis不支持这个特性,这是redis的设计原则决定的。可以在Hash中每个field对应的value本身含有时间的信息,让应用自己去理解和处理。

在redis里维护自增长的主键

有时候可能需要在redis的多个数据结构之间维护一个类似关系型数据库中的自增长主键,可以利用SortedSets的ZINCRBY

0510b0e23e3d45ae1b23d06736849ef8.png

上面的意思是将myset中的config_no的score值加1,让key不存在或member不存在时上面的命令相当于:

e2230db2bda4f1f6517277c973a53a1d.png

既然redis可以实现区间查询,那么在Redis中可以实现查找某个值的范围吗?

小编看到有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地。

此时可以怎么做?

例如有下面两个范围,10-20和30-40

d938ca017bd58fa96dc95874c3371eae.png

我们将这两个范围的起始位置存在Redis的SortedSets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:

a1c17b38364fea26d76205e777bb75c7.png

这样数据在插入SortedSets后,相当于是将这些起始位置按顺序排列好了。

现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:

c3fcc31bd1b49f75d1c6d5231055633c.png

这个命令的意思是在SortedSets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)

查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。

当然,如果你查找到的是一个start,比如咱们用25,执行下面的命令

af9823a29a1cf3ef4ffb0fe2bbd58229.png

返回结果表明其下一个节点是一个start节点,也就是说25这个值不处在任何start和end之间,不属于任何范围。

当然,这个例子仅适用于类似上面的IP范围查找的案例,因为这些值范围之间没有重合。如果是有重合的情况,这个问题本身也就变成了一个一对多的问题。

小编结语:

更多内容尽在课课家教育。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值