Redis 中的 Zset 数据结构详解

目录

用法

[1. 增](#1. 增)

[2. 删](#2. 删)

[3. 查](#3. 查)

[4. 交,并](#4. 交,并)

编码方式

应用场景


Redis 中的 Zset(有序集合)是一种将元素按照分数进行排序的数据结构。与上篇写的SetRedis 中的 Set 数据结构详解不同,Zset 中的每个元素都关联一个浮点数类型的分数。


用法

常见命令

1. 增

添加或者更新
ZADD key [ NX | XX ] [ GT | LT ] [ CH ] [ INCR ] score member [score member ...]
注意:
XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
NX:仅⽤于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

2. 删

删除指定的元素。

ZREM key member [member ...]

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

ZPOPMAX key [count]

ZPOPMAX 的阻塞版本。

BZPOPMAX key [key ...] timeout

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

ZPOPMIN key [count]

ZPOPMIN 的阻塞版本。

BZPOPMIN key [key ...] timeout

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

ZREMRANGEBYRANK key start stop

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

ZREMRANGEBYSCORE key min max

3. 查

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

ZCARD key

返回分数在 min 和 max之间的元素个数

ZCOUNT key min max

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

ZRANGE key start stop [WITHSCORES]

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

ZRANK key member

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

ZREVRANK key member

返回指定元素的分数。

ZSCORE key member

4. 交,并

交集

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

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]]

AGGREGATE \

并集

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight

weight ...\]\] \[AGGREGATE \


编码方式

**ziplist(压缩列表):**当有序集合中的元素数量较少且每个元素都比较小(总大小不超过 64 个字节,元素数量不超过 128 个)时,Redis 使用紧凑的 ziplist 结构。ziplist 是一种连续内存块,可以有效减少内存占用。

**skiplist(跳表):**当有序集合变大或元素变复杂时,Redis 会自动切换到 skiplist 编码。skiplist 是一种跳表(就是复杂的链表,一个节点上可能有多个指针)结构,适合快速的范围查询和插入操作。


应用场景

热搜 / 排行榜 :Zset 非常适合用于实现排行榜系统,例如游戏中的积分排行榜、博客系统中的热门文章排行榜。通过 ZADD 插入或更新用户分数,通过 ZRANGEZREVRANGE 获取排名。

  1. 添加用户赞数

    zadd user:ranking:2024-05-25 3 llt

如果再获得赞,可以使⽤ zincrby:

复制代码
zincrby user:ranking:2024-05-15 1 llt
  1. 取消用户点赞

    zrem user:ranking:2024-05-25 tom

  2. 展示获取赞数最多的 10 个用户

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

  3. 展示用户信息以及用户分数

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

延迟队列 :可以利用 Zset 实现延迟队列,任务按延迟时间排序。将任务的执行时间作为分数,通过 ZRANGEBYSCORE 获取到期的任务。

推荐系统:在推荐系统中,可以使用 Zset 维护用户的行为分数(如点击、点赞等),并根据分数进行排序推荐。

相关推荐
zew10409945881 分钟前
PyCharm【2023.2.5】下使用编辑器自带的连接功能,连接MySQL数据库
数据库·mysql·pycharm·编辑器·连接mysql
正在走向自律1 小时前
Oracle迁移至金仓数据库:PL/SQL匿名块执行失败的深度排查指南
数据库·sql·oracle·国产数据库·电科金仓
写写闲篇儿4 小时前
下一个更大元素(一)
数据结构·算法
炽烈小老头6 小时前
【每天学习一点算法 2025/12/19】二叉树的层序遍历
数据结构·学习·算法
Evan芙6 小时前
RDBMS的库、表、视图、索引、设计范式总结
数据库
一叶飘零_sweeeet6 小时前
从单机到集群:Redis部署全攻略
数据库·redis·缓存
Queenie_Charlie6 小时前
HASH表
数据结构·c++·哈希算法
soft20015257 小时前
MySQL Buffer Pool深度解析:LRU算法的完美与缺陷
数据库·mysql·算法
C++业余爱好者7 小时前
SQL Server 中数据库管理系统、数据库实例与数据库的关系与区别
数据库·oracle
保护我方头发丶7 小时前
ESP-wifi-蓝牙
前端·javascript·数据库