Redis初识第七期---ZSet的命令和应用场景
ZSet相较于Set来说,它又是有序的,这个有序指的就是我们通常意义上的有序了,ZSet内部中是按照升序来排序的。
排序规则:ZSet相较于Set来说,它内部引入了一个新的属性:分数(Score),浮点类型,对于每一个member都有一个Score与之对应,member是要求唯一的,但是Score是可以重复的,排序的依据就是Score,如果Score重复的话,则按照字典序进行排序。
命令
普通操作
1.Zadd
完整语法:
Zadd key [NX|XX] [GT|LT] [ch] [Incr] Score member [Score member.....]
作用是添加元素。时间复杂度为O(logn)。
参数:
[NX|XX]:NX表示只添加不更新,如果已经存在,即使Score不同也会添加失败。XX:表示只更新,不添加。默认情况为不存在就添加,存在的话就更新分数。
[GT|LT]:GT表示比原来Score大才更新,LT就表示比原来Score分数小才更新。
[CH]:不写CH返回的是添加的个数,如果写上CH则将更新的也包含在内。主要适用于XX,因为它只更新不添加,返回值默认为0。
[Incr]:对元素进行加减操作,默认为加,减的话使用负数来实现,使用后后面就只能指定一个Score和member了。(不能同时对多组member进行操作)。
2.Zrange
和List中Lrange类似,可以查询一对下标构成的空间,但是Zrange可以在下标后加上WithScores来同时查询member和Score,时间复杂度为O(logn);
3.Zcard
Zcard key
获取key中的元素个数。
4.ZCount key min max
获取Score在min和max中的元素个数,值得注意的是Max和Min为闭区间,如果想要为开区间可以在前面加上(,即(min (max,同时Redis引入了两个特殊值:inf:表示无穷大,-inf:表示无穷小。
5.Zrevrange
用法和Zrange一样,只不过是逆序返回罢了。
阻塞版本命令
6.ZpopMax
ZpopMax key [count]
删除并返回分数最高的count个元素。
7.BzpopMax
BzpopMax key[key....] timeout
ZpopMax的阻塞版本,提供timeout来指定最长阻塞时间,支持小数,单位s。但是和ZpopMax不同的是不可以指定删除的个数。
8.ZpopMin
ZpopMin key [count]
删除Zset中Score最小的count个元素。
9.BzpopMin key[key...] timeout
和BzpopMax用法一样,这里不做过多赘述。
值得注意的是以上操作的时间复杂度都是O(logn)(内部编码为ziplist时为O(N)),这是因为SkipList没有维护头部指针和尾部指针,即使是头/尾删,仍然需要遍历。
10.Zrank key member
时间复杂度为O(logN)。
作用是获取key中member的排名(下标)。
11.ZrevRank key member
也是获取member的排名,只不过是逆序(降序)。
12.Zscore key member
查找指定元素的分数,但是时间复杂度为O(1)!,这是因为Redis同时维护了一个哈希表,使得查找复杂度为O(1)。
13.Zrem key member [member....]
删除指定的元素,返回删除的个数。
14.ZremRangeByRank key start stop
范围删除,把从start到stop之间的全删了(根据下标)。
15.ZremRangeByScore key min max
指定一个删除区间,通过分数来描述。
16.ZincrBy key increment member
给指定的member增加increment(支持小数)。
集合间操作
Zinter,Zunion,Zdiff从Redis6.2才支持,用法和ZinterStore,ZunionStore类似,这里不过多解释了。
17.ZinterStore
ZinterStore destination numbers key [key.....] [weights....] [Aggregate <Sum|Min|Max>]
求并集并存储到destination中。
numbers:指定有多少个key参与运算,避免key和后面的参数混肴。
weights:权重,就是每个key中Score要乘的倍数,如果要使用的话,前面必须要加上weights关键字。
Aggregate <Sum|Min|Max>:Sum表示取分数之和(默认情况),Min表示取分数最小的,Max表示取分数最大的,使用前要加上Aggregate关键字。
18.ZunionStore
ZunionStore destination bunbers key[key....] [weights...] Aggregate <Sum|Min|Max>]
用法和ZinterStore一样,只不过求的是合集罢了。
Zset内部编码
1.ziplist
如果有序集合的元素比较少而且单个元素的体积较小,使用ziplist存储。
2.skipList
复杂的链表,一个节点上有很多的指针,让查询时间更短(O(logn))。
Zset应用场景
1.最常见的场景,排行榜系统。
2.还可以使用集合操作来对热点信息进行排序,例如微博热度可以使用加权对评论,转发,浏览来进行加权,得出一个分数。