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 中的元素个数。
语法
zcard key
时间复杂度: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 都是包含的,可以通过 ( 排除。
语法
zcount key 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
删除并返回分数最⾼的 count 个元素。
语法
zpopmax key [count]
时间复杂度: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
zpopmax 的阻塞版本。
语法
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
删除并返回分数最低的 count 个元素。
语法
zpopmin key [count]
时间复杂度: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
zpopmin 的阻塞版本。
语法
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
返回指定元素的排名,升序。
语法
zrank key member
时间复杂度: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
返回指定元素的排名,降序。
语法
zrevrank key member
时间复杂度: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
返回指定元素的分数。
语法
zscore key member
时间复杂度: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) 3
127.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) 129
127.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) 1
127.0.0.1:6379> object encoding zsetkey
"skiplist”
应用场景
1.排行榜
zset非常适合用于实现各种排行榜,如游戏内的玩家排名、社交平台的热门帖子排名等。
元素可以是玩家的id或帖子的id,分数可以是玩家的积分或帖子的点赞数、评论数等。
可以使用zrange或zrevrange命令来获取排名前列的元素,或使用zrank或zrevrank命令来获取特定元素的排名。
2.延时队列
zset可以用于实现延时队列,其中元素代表任务,分数代表任务的执行时间戳。
通过定期检查zset中分数最小的元素(即最早应该执行的任务),可以实现任务的定时执行。
当任务执行后,可以从zset中删除该元素。
总结
到此这篇关于redis的zset类型及相关命令的文章就介绍到这了,更多相关redis zset命令详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论