Zset简介
- 有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。
复制代码
ZADD
- 添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。
复制代码 语法- ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
复制代码 ZADD 的相关选项:- • XX:仅仅⽤于更新已经存在的元素,不会添加新元素。• NX:仅⽤于添加新元素,不会更新已经存在的元素。• CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。• INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
复制代码 时间复杂度:O(log(N))
返回值:本次添加成功的元素个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 1 "uno"
- (integer) 1
- redis> ZADD myzset 2 "two" 3 "three"
- (integer) 2
- redis> ZRANGE myzset 0 -1 WITHSCORES
- 1) "one"
- 2) "1"
- 3) "uno"
- 4) "1"
- 5) "two"
- 6) "2"
- 7) "three"
- 8) "3"
复制代码 ZCARD
- 获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。
复制代码 语法时间复杂度:O(1)
返回值:zset 内的元素个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZCARD myzset
- (integer) 2
复制代码 ZCOUNT
- 返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
复制代码 语法时间复杂度:O(log(N))
返回值:满⾜条件的元素列表个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZCOUNT myzset -inf +inf
- (integer) 3
- redis> ZCOUNT myzset (1 3
- (integer) 2
复制代码 ZRANGE
- 返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。
复制代码 语法- ZRANGE key start stop [WITHSCORES]
复制代码 时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
举例- redis> ZADD myzset 1 "one" 2 "two" 3 "three"
- (integer) 3
- redis> ZRANGE myzset 0 -1
- 1) "one"
- 2) "two"
- 3) "three"
- redis> ZRANGE myzset 2 3
- 1) "three"
- redis> ZRANGE myzset -2 -1
- 1) "two"
- 2) "three"
复制代码 ZREVRANGE
- 返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。
复制代码 语法- ZREVRANGE key start stop [WITHSCORES]
复制代码 时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZREVRANGE myzset 0 -1
- 1) "three"
- 2) "two"
- 3) "one"
- redis> ZREVRANGE myzset 2 3
- 1) "one"
- redis> ZREVRANGE myzset -2 -1
- 1) "two"
- 2) "one"
复制代码 ZRANGEBYSCORE
- 返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
复制代码 语法- ZRANGEBYSCORE key min max [WITHSCORES]
复制代码 时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZRANGEBYSCORE myzset -inf +inf
- 1) "one"
- 2) "two"
- 3) "three"
- redis> ZRANGEBYSCORE myzset 1 2
- 1) "one"
- 2) "two"
- redis> ZRANGEBYSCORE myzset (1 2
- 1) "two"
- redis> ZRANGEBYSCORE myzset (1 (2
- (empty array)
复制代码 ZPOPMAX
语法时间复杂度:O(log(N) * M)
返回值:分数和元素列表。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZPOPMAX myzset
- 1) "three"
- 2) "3"
复制代码 BZPOPMAX
语法- BZPOPMAX key [key ...] timeout
复制代码 时间复杂度:O(log(N))
返回值:元素列表。
举例- redis> DEL zset1 zset2
- (integer) 0
- redis> ZADD zset1 0 a 1 b 2 c
- (integer) 3
- redis> BZPOPMAX zset1 zset2 0
- 1) "zset1"
- 2) "c"
- 3) "2"
复制代码 ZPOPMIN
语法时间复杂度:O(log(N) * M)
返回值:分数和元素列表。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZPOPMIN myzset
- 1) "one"
- 2) "1"
复制代码 BZPOPMIN
语法- BZPOPMIN key [key ...] timeout
复制代码 时间复杂度:O(log(N))
返回值:元素列表。
举例- redis> DEL zset1 zset2
- (integer) 0
- redis> ZADD zset1 0 a 1 b 2 c
- (integer) 3
- redis> BZPOPMIN zset1 zset2 0
- 1) "zset1"
- 2) "a"
- 3) "0"
复制代码 ZRANK
语法时间复杂度:O(log(N))
返回值:排名。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZRANK myzset "three"
- (integer) 2
- redis> ZRANK myzset "four"
- (nil)
- redis> ZRANK myzset "three" WITHSCORE
- 1) (integer) 2
- 2) "3"
- redis> ZRANK myzset "four" WITHSCORE
- (nil)
复制代码 ZREVRANK
语法时间复杂度:O(log(N))
返回值:排名。- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZREVRANK myzset "one"
- (integer) 2
- redis> ZREVRANK myzset "four"
- (nil)
- redis> ZREVRANK myzset "three" WITHSCORE
- 1) (integer) 0
- 2) "3"
- redis> ZREVRANK myzset "four" WITHSCORE
- (nil)
复制代码 ZSCORE
语法时间复杂度:O(1)
返回值:分数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZSCORE myzset "one"
- "1"
复制代码 ZREM
语法- ZREM key member [member ...]
复制代码 时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZREM myzset "two"
- (integer) 1
- redis> ZRANGE myzset 0 -1 WITHSCORES
- 1) "one"
- 2) "1"
- 3) "three"
- 4) "3"
复制代码 ZREMRANGEBYRANK
语法- ZREMRANGEBYRANK key start stop
复制代码 时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZREMRANGEBYRANK myzset 0 1
- (integer) 2
- redis> ZRANGE myzset 0 -1 WITHSCORES
- 1) "three"
- 2) "3"
复制代码 ZREMRANGEBYSCORE
语法- ZREMRANGEBYSCORE key min max
复制代码 时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZREMRANGEBYSCORE myzset -inf (2
- (integer) 1
- redis> ZRANGE myzset 0 -1 WITHSCORES
- 1) "two"
- 2) "2"
- 3) "three"
- 4) "3"
复制代码 ZINCRBY
语法- ZINCRBY key increment member
复制代码 时间复杂度:O(log(N))
返回值:增加后元素的分数。
举例- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZINCRBY myzset 2 "one"
- "3"
- redis> ZRANGE myzset 0 -1 WITHSCORES
- 1) "two"
- 2) "2"
- 3) "one"
- 4) "3"
复制代码 ZINTERSTORE
- 求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
复制代码 语法- ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
- [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
复制代码 时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数。
举例- redis> ZADD zset1 1 "one"
- (integer) 1
- redis> ZADD zset1 2 "two"
- (integer) 1
- redis> ZADD zset2 1 "one"
- (integer) 1
- redis> ZADD zset2 2 "two"
- (integer) 1
- redis> ZADD zset2 3 "three"
- (integer) 1
- redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
- (integer) 2
- redis> ZRANGE out 0 -1 WITHSCORES
- 1) "one"
- 2) "5"
- 3) "two"
- 4) "10"
复制代码 ZUNIONSTORE
- 求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
复制代码 语法- ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
- [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
复制代码 时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数。
举例- redis> ZADD zset1 1 "one"
- (integer) 1
- redis> ZADD zset1 2 "two"
- (integer) 1
- redis> ZADD zset2 1 "one"
- (integer) 1
- redis> ZADD zset2 2 "two"
- (integer) 1
- redis> ZADD zset2 3 "three"
- (integer) 1
- redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
- (integer) 3
- redis> ZRANGE out 0 -1 WITHSCORES
- 1) "one"
- 2) "5"
- 3) "three"
- 4) "9"
- 5) "two"
- 6) "10"
复制代码 内部编码
有序集合类型的内部编码有两种:- • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。• skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。
复制代码 1)当元素个数较少且每个元素较⼩时,内部编码为 ziplist:- 127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3(integer) 3127.0.0.1:6379> object encoding zsetkey"ziplist"
复制代码 2)当元素个数超过 128 个,内部编码 skiplist:- 127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3 ... 省略 ... 82 e129(integer) 129127.0.0.1:6379> object encoding zsetkey"skiplist"
复制代码 3)当某个元素⼤于 64 字节时,内部编码 skiplist:- 127.0.0.1:6379> zadd zsetkey 50 "one string bigger than 64 bytes ... 省略 ..."(integer) 1127.0.0.1:6379> object encoding zsetkey"skiplist”
复制代码 应用场景
1.排行榜- Zset非常适合用于实现各种排行榜,如游戏内的玩家排名、社交平台的热门帖子排名等。元素可以是玩家的ID或帖子的ID,分数可以是玩家的积分或帖子的点赞数、评论数等。可以使用ZRANGE或ZREVRANGE命令来获取排名前列的元素,或使用ZRANK或ZREVRANK命令来获取特定元素的排名。
复制代码 2.延时队列- Zset可以用于实现延时队列,其中元素代表任务,分数代表任务的执行时间戳。通过定期检查Zset中分数最小的元素(即最早应该执行的任务),可以实现任务的定时执行。当任务执行后,可以从Zset中删除该元素。
复制代码 总结
到此这篇关于Redis的Zset类型及相关命令的文章就介绍到这了,更多相关Redis Zset命令详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://www.jb51.net/database/3350092e1.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |