MySQL数据库工程师入门实战课程视频教程
4198 人在学
在实际开发中经常遇到这样需求:服务端对于客户端不同的版本区间会做些不同的配置,那么客户端一个版本过来怎么快速的定位是属于哪个版本区间呢?
小编告诉你答案:可以利用Sorted Sets的zrangebyscore命令。
如上我们像myset里插入了4条数据,代表的意思是版本区间v1是从1011-1015版本,版本区间v2是从1018-1023版本。注:Redis的SortedSets需要score必须为float型,所以这里需要对版本号做一个等价的转换。那么我现在如何判断1014版本属于哪个区间呢,使用zrangebyscore如下操作:
返回v1_end说明1014属于版本区间1,上面的这个命令的意思是在myset中查找第一个score值大于等于1014的member,如果我们查找一个不在区间内的版本,比如1016:
返回v2_start说明它不已有的版本区间内。关于该命令的具体用法可以看这里这里。
不过这种用法不适合那些区间之间存在重叠的场景。
实现一个hash里不同的field拥有不同expire的场景
目前redis不支持这个特性,这是redis的设计原则决定的。可以在Hash中每个field对应的value本身含有时间的信息,让应用自己去理解和处理。
在redis里维护自增长的主键
有时候可能需要在redis的多个数据结构之间维护一个类似关系型数据库中的自增长主键,可以利用SortedSets的ZINCRBY
上面的意思是将myset中的config_no的score值加1,让key不存在或member不存在时上面的命令相当于:
既然redis可以实现区间查询,那么在Redis中可以实现查找某个值的范围吗?
小编看到有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地。
此时可以怎么做?
例如有下面两个范围,10-20和30-40
我们将这两个范围的起始位置存在Redis的SortedSets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:
这样数据在插入SortedSets后,相当于是将这些起始位置按顺序排列好了。
现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:
这个命令的意思是在SortedSets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)
查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。
当然,如果你查找到的是一个start,比如咱们用25,执行下面的命令
返回结果表明其下一个节点是一个start节点,也就是说25这个值不处在任何start和end之间,不属于任何范围。
当然,这个例子仅适用于类似上面的IP范围查找的案例,因为这些值范围之间没有重合。如果是有重合的情况,这个问题本身也就变成了一个一对多的问题。
小编结语:
更多内容尽在课课家教育。