Redis中实现查找某个值的范围

 更新时间:2015年06月24日 09:09:04   投稿:junjie  
这篇文章主要介绍了Redis中实现查找某个值的范围,本文的题引来了Redis作者Salvatore Sanfilippo(@antirez)的回答,比较经典,需要的朋友可以参考下

本文来自Redis在Google Group上的一个问题,有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地。这个问题引来了Redis作者Salvatore Sanfilippo(@antirez)的回答。解答如下:

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

复制代码 代码如下:

A_start 10, A_end 20
B_start 30, B_end 40

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

复制代码 代码如下:

redis 127.0.0.1:6379> zadd ranges 10 A_start
(integer) 1
redis 127.0.0.1:6379> zadd ranges 20 A_end
(integer) 1
redis 127.0.0.1:6379> zadd ranges 30 B_start
(integer) 1
redis 127.0.0.1:6379> zadd ranges 40 B_end
(integer) 1

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

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

复制代码 代码如下:

redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 1
1) "A_end"

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

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

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

复制代码 代码如下:

redis 127.0.0.1:6379> zrangebyscore ranges (25 +inf LIMIT 0 1
1) "B_start"

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

当然,这个例子仅适用于类似上面的IP范围查找的案例,因为这些值范围之间没有重合。如果是有重合的情况,这个问题本身也就变成了一个一对多的问题。好吧,如果真的是有重合的范围,我们又当如何解决呢?欢迎读者同学你来挑战。

相关文章

  • 基于Redis无序集合如何实现禁止多端登录功能

    基于Redis无序集合如何实现禁止多端登录功能

    这篇文章主要给你大家介绍了关于基于Redis无序集合如何实现禁止多端登录功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Redis未授权访问配合SSH key文件利用详解

    Redis未授权访问配合SSH key文件利用详解

    这篇文章主要给大家介绍了关于Redis未授权访问配合SSH key文件利用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 浅谈Redis安全策略

    浅谈Redis安全策略

    Redis 提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。本文就详细的介绍了一下Redis安全策略,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • Redis集群节点通信过程/原理流程分析

    Redis集群节点通信过程/原理流程分析

    这篇文章主要介绍了Redis集群节点通信过程/原理,详细介绍了Cluster(集群)的节点通信的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 浅谈Redis中的缓存更新策略

    浅谈Redis中的缓存更新策略

    这篇文章主要介绍了浅谈Redis中的缓存更新策略,CacheAsidePatter是我们比较常用的缓存更新策略,其由缓存调用者在更新数据库时,在业务逻辑中设置缓存更新,需要的朋友可以参考下
    2023-08-08
  • Redis分布式缓存:微信抢红包解决方案

    Redis分布式缓存:微信抢红包解决方案

    微信抢红包已经在我们生活中很常见的场景了,特别是年底公司开年会和春节2个时间段。本文主要介绍了通过Redis实现微信抢红包功能,感兴趣的小伙伴可以了解一下
    2021-12-12
  • 详解Redis中Lua脚本的应用和实践

    详解Redis中Lua脚本的应用和实践

    这篇文章主要介绍了详解Redis中Lua脚本的应用和实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 解锁redis锁的正确姿势

    解锁redis锁的正确姿势

    这篇文章主要为大家详细介绍了解锁redis锁的正确姿势,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 启动redis出现闪退情况的解决办法

    启动redis出现闪退情况的解决办法

    最近使用Redis遇到启动闪退的问题,查阅资料后在一位大神的文章中找到了答案,这篇文章主要给大家介绍了关于启动redis出现闪退情况的解决办法,需要的朋友可以参考下
    2023-11-11
  • redis在php中常用的语法【推荐】

    redis在php中常用的语法【推荐】

    string是redis最基本的类型,而且string类型是二进制安全的。这篇文章主要介绍了redis在php中常用的语法,需要的朋友可以参考下
    2018-08-08

最新评论