【redis初阶】Zset 有序集合类型

目录

一、Zset 有序集合类型介绍

二、普通命令

2.1 ZADD

2.2 ZCARD

2.3 ZCOUNT

2.4 ZRANGE

2.5 ZREVRANGE

2.6 ZRANGEBYSCORE

2.7 ZPOPMAX

2.8 BZPOPMAX

2.9 ZPOPMIN

2.10 BZPOPMIN

2.11 ZRANK

2.12 ZREVRANK

2.13 ZSCORE

2.14 ZREM

2.15 ZREMRANGEBYRANK

2.16 ZREMRANGEBYSCORE

2.17 ZINCRBY

2.18 集合间操作

2.19 ZINTERSTORE

2.20 ZUNIONSTORE

2.21 命令小结

三、内部编码

四、使用场景


redis学习🥳

一、Zset 有序集合类型介绍

有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。它保留了集合不能有重复成员的特

点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关

联,使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分

数。如图 2-26 所示,该有序集合显示了三国中的武将的武力。

图 2-26 有序集合

有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利用有序集合,可以帮

助我们在实际开发中解决很多问题。

💡 有序集合中的元素是不能重复的,但分数允许重复。类比于一次考试之后,每个人一定有一个唯一的分数,但分数允许相同。

表 2-7 列表、集合、有序集合三者的异同点。

二、普通命令

2.1 ZADD

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf / -inf 作为正负极限也是合法的。

ZADD 的相关选项:

• XX:仅仅用于更新已经存在的元素,不会添加新元素。

• NX:仅用于添加新元素,不会更新已经存在的元素。

• CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更

新的元素的个数。

• INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定一个元素和

分数。

语法:

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]

命令有效版本:1.2.0 之后

时间复杂度:O(log(N))

返回值:本次添加成功的元素个数。

示例:

2.2 ZCARD

获取一个 zset 的基数(cardinality),即 zset 中的元素个数。

语法:

ZCARD key

命令有效版本:1.2.0 之后

时间复杂度:O(1)

返回值:zset 内的元素个数。

示例:

2.3 ZCOUNT

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

语法:

ZCOUNT key min max

命令有效版本:2.0.0 之后

时间复杂度:O(log(N))

返回值:满足条件的元素列表个数。

示例:

2.4 ZRANGE

返回指定区间里的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。

语法:

ZRANGE key start stop [WITHSCORES]

# 此处的 [start, stop] 为下标构成的区间,从 0 开始,支持负数.

命令有效版本:1.2.0 之后

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表。

示例:

2.5 ZREVRANGE

返回指定区间里的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。

备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。

语法:

ZREVRANGE key start stop [WITHSCORES]

命令有效版本:1.2.0 之后

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表。

示例:

2.6 ZRANGEBYSCORE

返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。

语法:

ZRANGEBYSCORE key min max [WITHSCORES]

命令有效版本:1.0.5 之后

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表。

示例:

2.7 ZPOPMAX

删除并返回分数最高的 count 个元素。

语法:

ZPOPMAX key [count]

命令有效版本:5.0.0 之后

时间复杂度:O(log(N) * M)

返回值:分数和元素列表。

示例:

2.8 BZPOPMAX

ZPOPMAX 的阻塞版本。

语法:

BZPOPMAX key [key ...] timeout

命令有效版本:5.0.0 之后

时间复杂度:O(log(N))

返回值:元素列表。

示例:

2.9 ZPOPMIN

删除并返回分数最低的 count 个元素。

语法:

ZPOPMIN key [count]

命令有效版本:5.0.0 之后

时间复杂度:O(log(N) * M)

返回值:分数和元素列表。

示例:

2.10 BZPOPMIN

ZPOPMIN 的阻塞版本。

语法:

BZPOPMIN key [key ...] timeout

命令有效版本:5.0.0 之后

时间复杂度:O(log(N))

返回值:元素列表。

示例:

2.11 ZRANK

返回指定元素的排名,升序。

语法:

ZRANK key member

命令有效版本:2.0.0 之后

时间复杂度:O(log(N))

返回值:排名。

示例:

2.12 ZREVRANK

返回指定元素的排名,降序。

语法:

ZREVRANK key member

命令有效版本:2.0.0 之后

时间复杂度:O(log(N))

返回值:排名。

示例:

2.13 ZSCORE

返回指定元素的分数。

语法:

ZSCORE key member

命令有效版本:1.2.0 之后

时间复杂度:O(1)

返回值:分数。

示例:

2.14 ZREM

删除指定的元素。

语法:

ZREM key member [member ...]

命令有效版本:1.2.0 之后

时间复杂度:O(M*log(N))

返回值:本次操作删除的元素个数。

示例:

2.15 ZREMRANGEBYRANK

按照排序,升序删除指定范围的元素,左闭右闭。

语法:

ZREMRANGEBYRANK key start stop

命令有效版本:2.0.0 之后

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数。

示例:

2.16 ZREMRANGEBYSCORE

按照分数删除指定范围的元素,左闭右闭。

语法:

ZREMRANGEBYSCORE key min max

命令有效版本:1.2.0 之后

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数。

示例:

2.17 ZINCRBY

为指定的元素的关联分数添加指定的分数值。

语法:

ZINCRBY key increment member

命令有效版本:1.2.0 之后

时间复杂度:O(log(N))

返回值:增加后元素的分数。

示例:

2.18 集合间操作

图 2-27 有序集合的交集操作

2.19 ZINTERSTORE

求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。

语法:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

命令有效版本:2.0.0 之后

时间复杂度:O(N*K)+O(M*log(M)) N 是输入的有序集合中,最小的有序集合的元素个数;K 是输入

了几个有序集合;M 是最终结果的有序集合的元素个数.

返回值:目标集合中的元素个数

示例:

图 2-28 有序集合的并集操作

2.20 ZUNIONSTORE

求出给定有序集合中元素的并集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。

语法:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

命令有效版本:2.0.0 之后

时间复杂度:O(N)+O(M*log(M)) N 是输入的有序集合总的元素个数;M 是最终结果的有序集合的元

素个数.

返回值:目标集合中的元素个数

示例:

2.21 命令小结

表 2-8 有序集合命令

三、内部编码

有序集合类型的内部编码有两种:

• ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认 128 个),

同时每个元素的值都小于 zset-max-ziplist-value 配置(默认 64字节)时,Redis 会用 ziplist 来作

为有序集合的内部实现,ziplist 可以有效减少内存的使用。

• skiplist(跳表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时

ziplist 的操作效率会下降。

1)当元素个数较少且每个元素较小时,内部编码为 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:

四、使用场景

有序集合比较典型的使用场景就是排行榜系统。例如常见的网站上的热榜信息,榜单的维度可能是多

方面的:按照时间、按照阅读量、按照点赞量。本例中我们使用点赞数这个维度,维护每天的热榜:

1)添加用户赞数

例如用户 james 发布了一篇文章,并获得 3 个赞,可以使用有序集合的 zadd 和 zincrby 功能:

zadd user:ranking:2022-03-15 3 james

之后如果再获得赞,可以使用 zincrby:

zincrby user:ranking:2022-03-15 1 james

2)取消用户赞数

由于各种原因(例如用户注销、用户作弊等)需要将用户删除,此时需要将用户从榜单中删除掉,可

以使用 zrem。例如删除成员 tom:

zrem user:ranking:2022-03-15 tom

3)展示获取赞数最多的 10 个用户

此功能使用 zrevrange命令实现:

zrevrangebyrank user:ranking:2022-03-15 0 9

4)展示用户信息以及用户分数

次功能将用户名作为键后缀,将用户信息保存在哈希类型中,至于用户的分数和排名可以使用 zscore

和 zrank 来实现。

hgetall user:info:tom
zscore user:ranking:2022-03-15 mike
zrank user:ranking:2022-03-15 mike

redis学习打卡🥳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞳绣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值