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

相关推荐
农村小镇哥7 分钟前
C#读取CSV文件的方法
服务器·数据库·c#
IMPYLH15 分钟前
HTML 的 <embed> 元素
前端·数据库·html
疯狂打码的少年21 分钟前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
油丶酸萝卜别吃1 小时前
Redis 布隆过滤器快速实现
数据库·redis·缓存
深念Y1 小时前
stable-diffusion.cpp 的 FLUX.2 Klein 9B 分步
java·前端·数据库
whn19771 小时前
oracle 的ora-19633处理
数据库·oracle
x-cmd1 小时前
用 Rust 打造 AI 时代的 SQL:把重复任务变成可执行文件
数据库·人工智能·sql·ai·容器·rust·workflow
小弥儿1 小时前
Firecrawl:把整个网页变成 AI 可查询的数据库
数据库·人工智能·学习
swordbob1 小时前
mysql数据库,明明有索引为啥不用
数据库·mysql
晴天¥2 小时前
Oracle ASM、ACFS、FLEX ASM三者之间的关系?
数据库·oracle