zset是一个有序集合,有着set的特点,还引入了排序。每个元素额外会有一个分数(score),元素不可重复,但是分数可以重复。排序以分数为主,如果分数相同,则按元素字典序。
推荐启动服务器时使用该命令:redis-cli --raw
目录
1.命令大全
2.命令介绍
3.编码方式与应用场景
1.命令大全
(1)有序集合zset的特点
- 命令以z开头
- 元素member唯一
- 每个member携带一个分数score
- 分数不唯一
- 元素在集合中以分数排序[元素字典序]
- redis默认采取升序的方式
(2)命令大全
命令 | 含义 |
---|---|
zadd key score member [score member … ] | 添加元素 |
zcard key | 获取集合中元素个数 |
zscore
key member
| 求元素分数 |
zrank
key member
| 求元素序号 |
zrevrank
key member
| 求元素序号(降序) |
zrem
key member [member ...]
| 移除元素 |
zincrby
key increment member
| 给元素分数+n |
zrange
key start end [withscores]
| 展示区间元素 |
zpopmax key [count] | 删除并得到最大值 |
zpopmin key [count] | 删除并得到最小值 |
zcount
key min max
| 返回区间分数的元素个数 |
zremrangebyrank
key start end
| 按升序下标,删除指定范围中的元素 |
zremrangebyscore
key min max
| 按升序分数,删除指定分数中的元素 |
zinterstore
destination numkeys key [key ...]
| 求交集并存到集合中 |
zunionstore
destination numkeys key [key ...]
| 求并集并存在集合中 |
2.命令介绍
(1)zadd
1)语法:zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member … ]
2)含义:添加k-v,一次性也可以同时添加多个
3)时间复杂度:O(log(N))
4)返回值:本次添加成功的元素个数
- 默认版本使用
成功添加三个元素,每个member携带一个score
默认下的含义:一次性可添加多个元素,返回添加成功的元素个数;如果当前的member不存在,就会添加新的;如果member存在,就会更新分数。
- [NX | XX] 讲解
表示可选项,使用zadd命令时可选可不选
NX:如果member存在,直接返回;如果member不存在,就会添加新元素(不会更新元素)
XX:如果member存在,就会更新分数score;如果不存在,就会返回(不会新增元素)
XX:
- [GT | LT] 讲解
这两个选项只存在于低版本的redis中。表示可选项,使用zadd命令时可选可不选。在更新分数时使用,默认不选都都可以更新。
GT:属于greater than的缩写。如果更新的分数比原始分数高,才能更新成功。否则不更新
LT:属于less than的缩写。如果更新的分数比元素分数低,才能更新成功。
- [CH] 详解
表示可选项,使用zadd命令时可选可不选。不选选项时,会返回新增成功个数,不会返回修改成功个数
含义:加上改选项后,更新成功member的score后,也会返回更新成功元素的个数。
- [INCR]
表示可选项,使用zadd命令时可选可不选
含义:加上该选项就类似zincrby的效果,可以给member的分数加上指定的分数,此时只能指定一个元素和分数。
(2)zcard
1)语法:zcard key
2)含义:获取key对应zset集合中的元素个数
3)时间复杂度:O(1)
4)返回值:zset内的元素个数
(3)zcount
1)语法:zcount key min max
2)含义:返回分数在min和max之间的元素个数。默认包含分数为min和max的,如果不需要包含,可以加上(。max和min可以为浮点数、inf(无穷大)和-inf(负无穷大)
3)时间复杂度:O(log(N))
4)返回值:满足条件的元素个数
5)遍历方式:找到max和min分数对应的下标,然后相减得到
正常包含:
不包含:加上左括号
(4)zrange
1)语法:zrange key start stop [withscores]
2)含义:返回指定区间中的元素,按照升序输出。下标同样支持负数,带上可选项withscores表示把member对应的分数也输出
3)时间复杂度:O(log(N)+M)
4)返回值:区间内的元素列表
不加可选项:
加上可选项:
(5)zrevrange(不推荐)
1)语法:zrevrange key start top [withscores]
2)含义:返回指定区间中的元素,按照降序输出。下标同样支持负数,带上可选项withscores表示把member对应的分数也输出。在版本6.2.0后已废弃
3)时间复杂度:O(log(N)+M)
4)返回值:区间内的元素列表
(6)zrangebyscore(不推荐)
1)语法:zrangebysocre key min max [withscores]
2)含义:返回分数在min和max之间的元素(member),默认包含min和max,可以通过(排序min和max。在版本6.2.0后已废弃。可以使用zcount代替
3)时间复杂度:O(log(N)+M)
4)返回值:区间内的元素列表
(7)zpopmax
1)语法:zpopmax key [count]
2)含义:删除并返回分数最高的count个元素。存在相同分数,则删除元素字典序在前面那个
3)时间复杂度:O (log(N) * M),M为count,N为zset中元素个数
4)返回值:分数和元素列表
(8)bzpopmax
1)语法:bzpopmax key [key … ] timeout
2)含义:zpopmax的阻塞版本
3)时间复杂度:O(log(N)),只在key中删除一次元素
4)返回值:元素列表
(9)zpopmin
1)语法:zpopmin key [count]
2)含义:删除并返回分数最低的count个元素
3)时间复杂度:O (log(N) * M),M为count,N为zset中元素个数
4)返回值:元素列表
(10)bzpopmin
1)语法:zpopmin key [key … ] timeout
2)含义:zpopmin 的阻塞版本
3)时间复杂度:O(log(N)),只在key中删除一次元素
4)返回值:元素列表
(11)zrank
1)语法:zrank key member
2)含义:返回指定元素的排序,按照升序输出,下标从0开始。有效版本2.0.0后
3)时间复杂度:O(log(N))
4)返回值:元素排名
(12)zrevrank
1)语法:zrevrank key member
2)含义:返回指定元素的排名,按照降序
3)时间复杂度:O(log(N))
4)返回值:元素排名
(13)zscore
1)语法:zscore key member
2)含义:返回指定元素的分数
3)时间复杂度:O(1)
4)返回值:元素的分数
(14) zrem
1)语法:zrem key member [mmeber]
2)含义:删除指定的元素
3)时间复杂度:O(M * log(N)),N是zset集合中的个数,M是删除的个数
4)返回值:成功删除的个数
(15)zremrangebyrank
1)语法:zremrangebyrank key start stop
2)含义:按照升序下标,删除指定范围中的元素,左右闭
3)时间复杂度:O(log(N)+M)
4)返回值:本次操作删除的元素个数
(16)zremrangebyscore
1)语法:zremrangebyscore key min max
2)含义:按照分数升序删除指定范围的元素
3)时间复杂度:O(log(N)+M)
4)返回值:本次操作删除的元素个数
(17)zincrby
1)语法:zincrby key increment member
2)含义:为指定元素的分数添加指定的分数值,支持正数、负数、浮点数
3)时间复杂度:O(log(N))
4)返回值:增加后元素的分数
(18)zinterstore
求交集(变少)
1)语法:zinterstore destination numkeys key [key … ] [weights weight weight … ] [aggregate <sum | min | max>]
2)含义:求交集,并且把交集的结果放入指定的key中
3)时间复杂度:O(N * K) + O(M * log(M))
4)返回值:目标集合中的元素个数
- 基本版本--不加任何选项
destination为目的集合;numkeys为求交集的集合个数,需要在前面指定;默认版本求交集分数是相加
- [weights weight weight … ] -- 权重选项
第一个weights表示权重,为关键字;后续的weight代表每个集合所占的权重比,用weight乘以集合中对应的分数为结果分数
求交集后:
这里的权重并不是求百分比,而是直接乘上的系数。
- [aggregate <sum | min | max>] -- 分数结果求法
不加上默认选项为求和,aggregate为关键字
sum: 结果分数求和;min: 结果分数求最小值;max: 结果分数求最大值
(19)zunionstore
求并集(变多)
1)语法:zunionstore destination numkeys key [key … ] [weights weight weight … ] [aggregate <sum | min | max>]
2)含义:求并集并把结果放入指定的key中
3)时间复杂度:O(n) + O(m * log(m))
4)返回值:目标集合中的元素个数
这里是求并集,参数语法和上面求交集一致,不额外讲解
3.编码方式与应用场景
(1)编码方式
- ziplist(压缩列表)
定义:当有序集合中的元素个数小于配置项时(默认128个),并且每个元素的值都小于配置项(默认64字节)时,zset内部就会采用ziplist来实现
- skiplist(跳表)
定义:不满足ziplist的条件就会采取skiplist的编码方式,也就是跳表
(2)应用场景 -- 排行榜系统
原因:zset是一个有序集合且默认为升序,刚好就符合排行榜的要求;另外,如果作为综合热榜,也可以根据求交集(指定权重比)来完成;而且排名的实时变化也很好改变。