下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

redis实现区间查询与查找某个值的范围

作者:课课家教育     来源: http://www.kokojia.com点击数:6248发布时间: 2019-03-01 11:15:49

标签: 数据库redis区间查询

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

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

redis实现区间查询与查找某个值的范围_数据库_redis_区间查询_课课家教育

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

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

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

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

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

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

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

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

  在redis里维护自增长的主键

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

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

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

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

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

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

  此时可以怎么做?

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

此时可以怎么做?    例如有下面两个范围,10-20和30-40

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

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

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

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

 这样数据在插入SortedSets后,相当于是将这些起始位置按顺序排列好了。    现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:

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

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

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

 这个命令的意思是在SortedSets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)    查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。    当然,如果你查找到的是一个start,比如咱们用25,执行下面的命令

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

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

  小编结语:

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

赞(22)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程