redis数据结构-09 (ZADD、ZRANGE、ZRANK)

Redis 排序集简介:ZADD、ZRANGE、ZRANK

Redis 有序集合是一种功能强大的数据结构,兼具集合和哈希的特性。它维护一组唯一元素,类似于集合;但每个元素都与一个分数相关联,类似于哈希。分数用于对有序集合中的元素进行排序,从而能够根据元素的排名高效地检索元素。本章节将向您介绍使用有序集合的基本命令: ZADDZRANGEZRANK 。我们将探索如何添加元素、如何根据元素的排名检索元素范围以及如何确定特定元素的排名。

向有序集合中添加元素:ZADD

ZADD 命令用于向有序集合中添加一个或多个成员,或更新现有成员的分数。语法如下:

复制代码
ZADD key [NX|XX] [GT|LT] [CH] [INCR score] score member [score member ...]

让我们分解一下该命令及其选项:

  • key :有序集合的名称。如果键不存在,则创建一个新的有序集合。
  • NX :仅当元素在有序集合中不存在时才添加该元素。
  • XX :仅当元素已存在于有序集合中时才更新该元素。
  • GT :仅当新分数大于当前分数时才更新元素的分数。
  • LT :仅当新分数小于当前分数时才更新元素的分数。
  • CH :修改返回值以返回已更改元素的数量。更改的元素包括新添加的元素和分数更新的元素。因此, ZADD 中指定的分数与之前相同的元素不计算在内。注意:通常情况下, ZADD 的返回值仅计算添加到集合中的新元素的数量。
  • INCR score :指定此选项时, ZADD 作用类似于 ZINCRBY 。在此模式下只能指定一个分数元素对。
  • score :与会员关联的分数。分数可以是整数或浮点数。
  • member :要添加到有序集合中的元素。

以下是一些示例:

复制代码
ZADD myzset 1 "one"

该命令将成员"one"添加到有序集合"myzset"中,得分为 1。

复制代码
ZADD myzset 2 "two" 3 "three"

此命令将两个成员"two"(得分为 2)和"three"(得分为 3)添加到有序集合"myzset"中。

复制代码
ZADD myzset NX 4 "four"

此命令尝试将分数为 4 的"four"添加​​到"myzset",但前提是"four"尚不存在。

复制代码
ZADD myzset XX 2.5 "two"

此命令尝试将"myzset"中的"two"分数更新为 2.5,但前提是"two"已经存在。

复制代码
ZADD myzset GT 5 "one"

此命令尝试将"myzset"中的"one"分数更新为 5,但前提是新分数(5)大于当前分数"one"。

复制代码
ZADD myzset CH 6 "six" 7 "one"

此命令添加得分为 6 的"六",并将得分"一"更新为 7。返回值将反映更改的数量(添加的新元素或得分更新的现有元素)。

重要注意事项:

  • 分数不必唯一。多个成员可以拥有相同的分数。当成员分数相同时,将按字典顺序(字母顺序)排序。
  • ZADD 是一个多功能命令,可用于添加新成员和更新现有成员的分数。
  • NXXXGTLTCHINCR 选项可以对 ZADD 操作方式进行细粒度的控制。

按排名检索元素:ZRANGE

ZRANGE 命令根据成员在有序集合中的排名(位置),检索有序集合中一定范围内的成员。其语法如下:

复制代码
ZRANGE key start stop [REV] [WITHSCORES]

让我们分解一下该命令及其选项:

  • key :排序集的名称。
  • start :范围的起始排名(含)。排名从 0 开始,即得分最低的成员排名为 0。
  • stop :范围的结束等级(含)。
  • REV :指定后,命令以相反的顺序返回元素(从最高分数到最低分数)。
  • WITHSCORES :指定后,命令将返回分数以及成员。

以下是一些示例:

首先,让我们用一些数据填充我们的 myzset

复制代码
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"

现在,让我们检索一些范围:

复制代码
ZRANGE myzset 0 2

此命令从"myzset"中检索排名为 0、1 和 2 的成员。输出如下:

复制代码
1) "one"
2) "two"
3) "three"

ZRANGE myzset 1 -1

此命令检索排序集合中从 1 到末尾的所有成员。索引 -1 表示最后一个元素。输出结果如下:

复制代码
1) "two"
2) "three"
3) "four"
4) "five"

ZRANGE myzset 0 2 WITHSCORES

此命令检索排名为 0、1 和 2 的成员及其分数。输出如下:

复制代码
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

ZRANGE myzset 0 -1 REV

此命令将按相反的顺序(从最高分到最低分)检索所有成员。输出如下:

复制代码
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"

重要注意事项:

  • ZRANGE 是一种根据成员的排名从排序集合中检索成员子集的有效方法。
  • 负索引可用于指定相对于排序集末尾的排名。
  • 当您需要检索成员及其相关分数时, WITHSCORES 选项很有用。
  • REV 选项允许您轻松地以相反的顺序检索成员。

确定元素的排名:ZRANK

ZRANK 命令返回有序集合中成员的排名。该排名从 0 开始,即得分最低的成员排名为 0。语法如下:

复制代码
ZRANK key member
  • key :排序集的名称。
  • member :您要确定其等级的成员。

以下是一些示例,继续使用 myzset

复制代码
ZRANK myzset "three"

此命令返回成员"three"在"myzset"中的排名。输出如下:

复制代码
(integer) 2

ZRANK myzset "one"

此命令返回成员"one"在"myzset"中的排名。输出如下:

复制代码
(integer) 0

ZRANK myzset "nonexistent"

此命令尝试检索排序集合中不存在的成员的排名。输出如下:

复制代码
(nil)

如果您想要按相反的顺序(从最高分到最低分)获得排名,您可以使用 ZREVRANK

复制代码
ZREVRANK myzset "three"

此命令返回"myzset"中成员"three"的反向排名。输出如下:

复制代码
(integer) 2

重要注意事项:

  • 如果成员不存在于排序集合中, ZRANK 返回 nil
  • ZRANK 是一种快速操作,因为它利用了数据结构的排序特性。
  • ZREVRANK 提供反向排名,在某些情况下很有用。
相关推荐
.生产的驴6 分钟前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
知行028 分钟前
MySQL的Docker版本,部署在ubantu系统
数据库·mysql·docker
朝新_19 分钟前
【MySQL】第三弹——表的CRUD进阶(一)数据库约束
数据库·mysql
yours_Gabriel44 分钟前
【登录认证】JWT令牌
java·开发语言·redis
qq_14182697321 小时前
python通过curl访问deepseek的API调用案例
java·数据库·python
可喜~可乐1 小时前
C# SQLite高级功能示例
数据库·sql·sqlite·c#
chenyuhao20241 小时前
链表的面试题4之合并有序链表
数据结构·链表·面试·c#
cooldream20092 小时前
深入理解主从数据库架构与主从复制
数据库·oracle·数据库架构·系统架构师
Eternity......2 小时前
spark MySQL数据库配置
数据库·mysql·spark
Freedom℡2 小时前
使用scp命令拷贝hadoop100中文件到其他虚拟机中
数据库·hadoop·spark