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

本文来自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范围查找的案例,因为这些值范围之间没有重合。如果是有重合的情况,这个问题本身也就变成了一个一对多的问题。好吧,如果真的是有重合的范围,我们又当如何解决呢?欢迎读者同学你来挑战。

时间: 2024-09-01 14:55:35

Redis中实现查找某个值的范围_Redis的相关文章

Excel2003中怎么查找重复值

打开microsoft office excel 2003版本.这里需要处理的是一份关于学校信息的文档.观察发现有一些学校信息存在重复,并且学校信息在排序上也暂无规律.  首先,为了我们在查找到重复值之后,更好得编辑或删除这些重复值,这里需要将这些学校信息进行排序.选中需要排序的列A,点击菜单栏-数据-排序.在弹出的排序窗口中,保持默认值,点击确定.结果如下图4所示.        选择需要查找重复值的区域.这里我选择从A2开始下拉选中所有学校信息.点击菜单栏-格式-条件格式.弹出条件格式对话框

redis中使用java脚本实现分布式锁_Redis

redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题.例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本. redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用

Redis中统计各种数据大小的方法_Redis

如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间:不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了. 有一些工具能够提供必要的帮助,比如 redis-rdb-tools 可以直接分析 RDB 文件来生成报告,可惜它不能百分百实现我的需求,而我也不想在它的基础上二次开发.实际上开发一个专用工具非常简单,利用 SCAN 和 DEBUG 等命令,没多少行代码就能实现: 复制代码 代码如下: <?php $patterns = array(   

C# dataset 怎么查找数据列中是否存在某个值?

问题描述 C# dataset 怎么查找数据列中是否存在某个值? dataset 怎么查找数据列中是否存在某个值?举例说明 A b c 110 2 3 105 58 99 125 56 80 查找a列是否存在180值? 解决方案 System.Data.DataSet ds = new System.Data.DataSet(); System.Data.DataTable dt = ds.Tables[0];//如果是其他表注意修改下标 System.Data.DataView dv = dt

redis中的list,hash,set,zset的内存占用或效率的大概次序是怎么样的?

问题描述 redis中的list,hash,set,zset的内存占用或效率的大概次序是怎么样的? 用一个键来存储一堆值,如果list,hash,set,zset业务都可以实现,从内存效率上来看,大概的顺序是怎么样的? 解决方案 set hash list zset 不需要顺序 就用set把. 解决方案二: list是有序的,set是无序的,后者性能更高,前者适合实现堆栈.队列这些需要顺序的结构.这里说的序是指插入序,不是排序.zset是有序列表,这里的有序是排序,不是插入序.hash适合检索信

深入理解Redis中的主键失效及其实现机制

   作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids也不例外.在Redis提供的诸多命令中,EXPIRE.EXPIREAT.PEXPIRE.PEXPIREAT以及SETEX和PSETEX均可以用来设置一条Key-Value对的失效时间,而一条Key-Value对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确).可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到Redis中又是如何呢?最近本博主就对Redis中的主键失效机制产生了几个

Redis中主键失效的原理及实现机制剖析_Redis

作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Redis 也不例外.在 Redis 提供的诸多命令中,EXPIRE.EXPIREAT.PEXPIRE.PEXPIREAT 以及 SETEX 和 PSETEX 均可以用来设置一条 Key-Value 对的失效时间,而一条 Key-Value 对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确).可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到 Redis 中又是如何呢?最近本博主就对 Redis

详解Redis中的双链表结构_Redis

Redis中双链表实现的基本结构: 1.节点结构 typedef struct listNode { struct listNode *prev; //前向节点 struct listNode *next; //后向节点 void *value; //该节点的值 } listNode; 2.双向链表结构 typedef struct list { listNode *head; //头节点 listNode *tail; //尾节点 void *(*dup)(void *ptr); //复制函数

redis中hash类型介绍和命令详解

在redis中,hash数据类型存储的数据与mysql数据库中存储一条记录极为相似,是一个string类型的field和value的映射表,它特别适合用于存储对象,但字段值只能是字符串,不支持其他类型. Redis hash是一个string类型的field和value的映射表.它的添加.删除操作都是 O(1) (平均). hash特别适合用于存储对象.相较于将对象的每个字段存成单个 string类型.将一个对象存 储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象.省内存的原