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 <SUM | MIN | MAX>]

并集

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


编码方式

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

相关推荐
wclass-zhengge几秒前
数据结构篇(绪论)
java·数据结构·算法
Dylanioucn几秒前
【分布式微服务云原生】探索Redis:数据结构的艺术与科学
数据结构·redis·分布式·缓存·中间件
何事驚慌1 分钟前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.1 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
大三觉醒push亡羊补牢女娲补天版2 分钟前
数据结构之排序(5)
数据结构
TJKFYY4 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
Code成立18 分钟前
1、深入理解Redis线程模型
数据库·redis·bootstrap
卡皮巴拉吖19 分钟前
【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?
数据结构
缘友一世2 小时前
macos安装mongodb
数据库·mongodb·macos
Starry_hello world3 小时前
二叉树实现
数据结构·笔记·有问必答