ZSet 型 Value 操作命令

11/26/2023 缓存Redis

Redis 存储数据的Value 可以是一个有序Set,这个有序 Set 中的每个元素均String 类型。有序 Set 与 Set 的不同之处是,有序 Set 中的每一个元素都有一个分值 score,Redis 会根据 score 的值对集合进行由小到大的排序。其与 Set 集合要求相同,元素不能重复,但元素的 score 可以重复。由于该类型的所有命令均是字母z 开头,所以该 Set 也称为 ZSet。

# 一、zadd

● 格式:ZADD key score member [[score member] [score member] ...]
● 功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。
● 说明:score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但score 值不同,则新的score 值将覆盖老 score。

# 二、zrange 与 zrevrange

● 格式:ZRANGE key start stop [WITHSCORES] 或 ZREVRANGE key start stop [WITHSCORES]
● 功能:返回有序集 key 中,指定区间内的成员。zrange 命令会按 score 值递增排序, zrevrange 命令会按score 递减排序。具有相同 score 值的成员按字典序/逆字典序排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回。
● 说明:下标参数从 0 开始,即 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误。例如,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。

# 三、zrangebyscore 与 zrevrangebyscore

● 格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
● 功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
● 说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)。

# 四、zcard

● 格式:ZCARD key
● 功能:返回集合的长度
● 说明:当 key 不存在时,返回 0。

# 五、zcount

● 格式:ZCOUNT key min max
● 功能:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min
或 max )的成员的数量。

# 六、zscore

● 格式:ZSCORE key member
● 功能:返回有序集 key 中,成员 member 的 score 值。
● 说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil。

# 七、zincrby

● 格式:ZINCRBY key increment member
● 功能:为有序集 key 的成员 member 的 score 值加上增量 increment 。increment 值可以是整数值或双精度浮点数。
● 说明:可以通过传递一个负数值 increment,让 score 减去相应的值。当 key 不存在,或 member不是 key 的成员时,ZINCRBY key increment member 等同于 ZADD key increment member。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score值。

# 八、zrank 与 zrevrank

● 格式:ZRANK key member 或 ZREVRANK key member
● 功能:返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。
● 说明:score 值最小的成员排名为 0 。如果 member 不是有序集 key 的成员,返回 nil。

# 九、zrem

● 格式:ZREM key member [member ...]
● 功能:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
● 说明:当 key 存在但不是有序集类型时,返回一个错误。执行成功,则返回被成功移除的成员的数量,不包括被忽略的成员。

# 十、zremrangebyrank

● 格式:ZREMRANGEBYRANK key start stop
● 功能:移除有序集 key 中,指定排名(rank)区间内的所有成员。
● 说明:排名区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。排名区间参数从 0 开始,即 0 表示排名第一的成员, 1表示排名第二的成员,以此类推。也可以使用负数表示,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。命令执行成功,则返回被移除成员的数量。

# 十一、zremrangebyscore

● 格式:ZREMRANGEBYSCORE key min max
● 功能:移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于min或max )的成员。
● 说明:命令执行成功,则返回被移除成员的数量。

# 十二、zrangebylex

● 格式:ZRANGEBYLEX key min max [LIMIT offset count]
● 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序。即这个命令返回给定集合中元素值介于 min 和 max 之间的成员。如果有序集合里面的成员带有不同的分值, 那么命令的执行结果与 zrange key 效果相同。
● 说明:合法的 min 和 max 参数必须包含左小括号“(”或左中括号“[”,其中左小括号“(”表示开区间, 而左中括号“[”则表示闭区间。min 或max 也可使用特殊字符“+”和“-”,分别表示正无穷大与负无穷大。

# 十三、zlexcount

● 格式:ZLEXCOUNT key min max
● 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令返回该集合中元素值本身(而非score 值)介于 min 和 max 范围内的元素数量。

# 十四、zremrangebylex

● 格式:ZREMRANGEBYLEX key min max
● 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令会移除该集合中元素值本身介于 min 和 max 范围内的所有元素。

# 十五、应用场景

有序 Set 最为典型的应用场景就是排行榜,例如音乐、视频平台中根据播放量进行排序的排行榜;电商平台根据用户评价或销售量进行排序的排行榜等。将播放量作为 score,将作品 id 作为 member,将用户评价积分或销售量作为 score,将商家 id 作为member。使用 zincrby 增加排序 score,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用 zscore 查询当前排序score 等。