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 维护用户的行为分数(如点击、点赞等),并根据分数进行排序推荐。

相关推荐
nongcunqq3 小时前
abap 操作 excel
java·数据库·excel
rain bye bye4 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
阿里云大数据AI技术5 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师6 小时前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
weixin_307779136 小时前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure
六元七角八分6 小时前
pom.xml
xml·数据库
虚行6 小时前
Mysql 数据同步中间件 对比
数据库·mysql·中间件
奥尔特星云大使6 小时前
mysql读写分离中间件Atlas安装部署及使用
数据库·mysql·中间件·读写分离·atlas
牛马baby7 小时前
【mysql】in 用到索引了吗?
数据库·mysql·in
杀气丶7 小时前
L2JBR - 修复数据库编码为UTF8
数据库·sql·oracle