博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
7. Zset 有序集合
命令
1. ZADD
2. ZRANGE
3. zcard
4. zcount
5. ZREVRANGE
6. ZRANGEBYSCORE
7. ZPOPMAX
8. BZPOPMAX
9. ZPOPMIN
10. BZPOPMIN
11. ZRANK
12. ZREVRANK
13. ZSCORE
14. ZREM
15. ZREMRANGEBYRANK
16. ZREMRANGEBYSCORE
17. ZINCRBY
集合间操作
18. ZINTERSTORE
19. ZUNIONSTORE
8. Zset内部编码
9. 应用场景
排行榜系统
10. 渐进式遍历
scan命令渐进式遍历
11. 数据库管理
20. 切换数据库
21. 清除数据库
7. Zset 有序集合
有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的 特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关 联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数
命令
1. ZADD
添加或者更新指定的元素以及关联的分数到zset中
XX:仅仅⽤于更新已经存在的元素,不会添加新元素
NX:仅⽤于添加新元素,不会更新已经存在的元素
CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更 新的元素的个数
INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和 分数
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
时间复杂度:O(log(N))
修改:
2. ZRANGE
返回指定区间⾥的元素,分数按照升序。带上WITHSCORES可以把分数也返回
ZRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
3. zcard
获取⼀个zset的基数,即zset中的元素个数
ZCARD key
时间复杂度:O(1)
返回值:zset内的元素个数
4. zcount
返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的,可以通过
ZCOUNT key min max
时间复杂度:O(log(N))
实际上,Zset内部会记录每个元素当前所排行的次序,查询到元素,就直接知道了元素所在的次序(下标),就可以直接把max对应的元素次序和min对应的元素次序,无需遍历
返回值:满⾜条件的元素列表个数
5. ZREVRANGE
返回指定区间⾥的元素,分数按照降序。带上WITHSCORES可以把分数也返回
这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中
ZREVRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
6. ZRANGEBYSCORE
返回分数在min和max之间的元素,默认情况下,min和max都是包含的,可以通过(排除
这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中
ZRANGEBYSCORE key min max [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
7. ZPOPMAX
删除并返回分数最⾼的count个元素
ZPOPMAX key [count]
时间复杂度:O(log(N)*M)
返回值:分数和元素列表
8. BZPOPMAX
ZPOPMAX的阻塞版本
BZPOPMAX key [key ...] timeout
这里的有序集合也可以视为是一个优先级队列,有的时候,也需要一个带有"阻塞功能"的优先级队列每个key都是一个有序集合,阻塞也是在集合为空的时候触发阻塞,阻塞到有其他客户端插入元素,timeout表示时间,最多阻塞多久,单位为s
时间复杂度:O(log(N))
返回值:元素列表
9. ZPOPMIN
删除并返回分数最低的count个元素
ZPOPMIN key [count]
时间复杂度:O(log(N)*M)
返回值:分数和元素列表
10. BZPOPMIN
ZPOPMIN的阻塞版本
BZPOPMIN key [key ...] timeout
时间复杂度:O(log(N))
返回值:元素列表
11. ZRANK
返回指定元素的排名,升序
ZRANK key member
时间复杂度:O(log(N))
返回值:排名
12. ZREVRANK
返回指定元素的排名,降序
ZREVRANK key member
时间复杂度:O(log(N))
返回值:排名
13. ZSCORE
返回指定元素的分数
ZSCORE key member
时间复杂度:O(1)
返回值:分数
14. ZREM
删除指定的元素
ZREM key member [member ...]
时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数
15. ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭
ZREMRANGEBYRANK key start stop
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数
16. ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭
ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数
17. ZINCRBY
为指定的元素的关联分数添加指定的分数值
ZINCRBY key increment member
时间复杂度:O(log(N))
返回值:增加后元素的分数
集合间操作
18. ZINTERSTORE
用于计算多个有序集合的交集,并将结果存储在新的有序集合中
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
destination
:结果有序集合的名称numkeys
:要计算交集的有序集合的数量key
:参与计算的有序集合的名称WEIGHTS
:指定每个有序集合的权重,默认权重为 1AGGREGATE
:指定交集结果的聚合方式,可以是SUM
(求和)、MIN
(最小值)或MAX
(最大值)。默认是SUM
时间复杂度:O(N*K)+O(M*log(M)) N是输⼊的有序集合中,最⼩的有序集合的元素个数;K是输⼊了 ⼏个有序集合;M是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数
19. ZUNIONSTORE
求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
时间复杂度:O(N)+O(M*log(M)) N是输⼊的有序集合总的元素个数;M是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数
8. Zset内部编码
有序集合类型的内部编码有两种:
ziplist(压缩列表):当有序集合的元素个数⼩于zset-max-ziplist-entries配置(默认128个), 同时每个元素的值都⼩于zset-max-ziplist-value配置(默认64字节)时,Redis会⽤ziplist来作 为有序集合的内部实现,ziplist可以有效减少内存的使⽤
skiplist(跳表):当ziplist条件不满⾜时,有序集合会使⽤skiplist作为内部实现,因为此时ziplist的操作效率会下降
9. 应用场景
排行榜系统
ZSet非常适合用来实现各种排行榜,例如网站的文章排行、学生成绩排行、直播间礼物排名榜等。通过分数(score)来确定排名,可以轻松地添加新元素、更新排名或获取排名信息
10. 渐进式遍历
scan命令渐进式遍历
Redis 使⽤scan命令进⾏渐进式遍历键,进⽽解决直接使⽤keys获取键时可能出现的阻塞问 题。每次scan命令的时间复杂度是O(1),但是要完整地完成所有键的遍历,需要执⾏多次scan
SCAN cursor [MATCH pattern] [COUNT count]
时间复杂度:O(1)
返回值:下⼀次scan的游标(cursor)以及本次得到的键
11. 数据库管理
20. 切换数据库
select dbIndex
21. 清除数据库
flushdb / flushall 命令⽤于清除数据库,区别在于flushdb只清除当前数据库,flushall会清楚所有数 据库