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

相关推荐
文人sec14 小时前
MYSQL:insert...select:为什么锁源表的所有行和间隙?怎么最快地复制一张表?
数据库·python·mysql
oradh14 小时前
Oracle联机日志文件损坏故障总结
数据库·oracle·oracle联机日志文件损坏
鹿角片ljp14 小时前
LeetCode 78:子集|回溯、选与不选、递归和path快照
java·数据结构·算法
YSL07012414 小时前
顺序表小补充
数据结构
IvorySQL14 小时前
PostgreSQL 日报|8 字节 TOAST 值支持(9 月 16 日)
数据库·人工智能·postgresql
wabs66615 小时前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
实验室管理云平台15 小时前
北京盛元广通推疾控中心实验室管理系统,提升检测效率
数据库·python
晴空蓝天15 小时前
Spring Boot 3.5 脚手架里的 JWT + Redis 双轨会话,双端 token 隔离我是这么设计的
java·spring boot·redis
极限实验室15 小时前
INFINI Easysearch 向量搜索实战(一)
数据库·搜索引擎
枫叶丹415 小时前
数据库上 Kubernetes 后,KES-Operator 如何简化集群运维
数据库