Zset(有序集合)类型
简介
Redis里面的有序集合Zset和集合Set非常相似,都是一个没有重复元素的字符串集合。
不同之处是有序集合Zset里面的每个成员都关联了一个评分(score),这个score被用来按照从最低分到最高分的方式排序集合中的元素。
集合中的成员是唯一的,但是评分可以是重复的。
因为集合中的元素是有序的,所以我们可以很快地根据评分(score)来获取某个范围内的元素
底层数据结构
SortedSet(Zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java里面的Map<String,Double>,可以给每个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
Zset底层使用了两种数据结构。
- hash。hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value(field)找到相应的score(value)值
- 跳跃表。跳跃表的目的在于给元素value进行排序,根据score的范围获取元素列表。
那么跳跃表的数据结构是啥呢?
我们先来看看普通有序链表查询一个元素的过程,如下图:
比如我们现在要查找一个元素是51,那得从1开始,一个一个往下一个节点查找,一个要经历5次往下查找的过程。
再看跳跃表的结构,如下图:
同样我们也是查找51这个元素,从第2层开始,查找到21,后面是null,然后到下一层。到了第1层的21,往下查找到41,41比51小,继续往下查找。查找到61,61比51大,回退到41,到第0层,第0层的41再往下找,正好是51。一共经历了4次查找的过程。
常用命令
zadd
将一个或多个member元素及其score值添加到有序集合key中
zadd <key> <score1> <value1> <score2> <value2>...
用法:
zrange
返回有序集中key中,下标在start和stop之间的元素。带着withscores,可以让分数一起和值返回到结果集。
用法:
zrange <key> <start> <stop> [withscores]
如下图:
返回value和score
zrangebyscore
返回有序集key中,所有score介于min和max之间(包括等于min和max的)的成员。
有序集成员按score值从小到大的次序排列显示。
用法:
zrangebyscore <key> <min> <max> [withscores]
如下图:
zrevrangebyscore
返回有序集key中,所有score介于max和min之间(包括等于max和min的)的成员。
有序集成员按score值从大到小的次序排列显示。
用法:
zrevrangebyscore <key> <max> <min> [withscores]
如下图:
zincrby
为集合key中元素的score加上增量
用法:
zincrby <key> <增量> <value>
如下图:
zrem
删除集合key中指定值的元素
用法:
zrem <key> <value>
如下图:
zcount
统计集合key中指定分数区间min到max中的成员数目。
用法:
zcount <key> <min> <max>
如下图:
zrank
返回元素值value在集合key中的排名(从0开始)。
用法:
zrank <key> <value>
如下图: