ZADD
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
- 自版本起
- 1.2.0
- 时间复杂度
- 对于每个添加的项目,时间复杂度为 O(log(N)),其中 N 是排序集合中的元素数量。
- ACL 类别
-
@write
,@sortedset
,@fast
,
将所有指定的成员与指定的得分添加到存储在 key
中的排序集合中。可以指定多个得分/成员对。如果指定的成员已经是排序集合的成员,则得分将被更新,并且该元素将被重新插入到正确的位置以确保正确的排序。
如果 key
不存在,则将创建一个具有指定成员为唯一成员的新排序集合,就像排序集合为空一样。如果该键存在但没有保存排序集合,则会返回错误。
得分值应为双精度浮点数的字符串表示形式。+inf
和 -inf
值也是有效值。
ZADD 选项
ZADD 支持一系列选项,这些选项在键名称之后和第一个得分参数之前指定。选项是
- XX: 仅更新已存在的元素。不要添加新元素。
- NX: 仅添加新元素。不要更新已存在的元素。
- LT: 只有当新的得分小于当前得分时,才更新已存在的元素。此标志不会阻止添加新元素。
- GT: 只有当新的得分大于当前得分时,才更新已存在的元素。此标志不会阻止添加新元素。
- CH: 将返回值从添加的新元素的数量修改为更改的元素总数 (CH 是更改的缩写)。更改的元素是新添加的元素和得分被更新的已存在元素。因此,命令行中指定的得分与过去相同的元素不计入。注意:通常,
ZADD
的返回值仅计算添加的新元素的数量。 - INCR: 当指定此选项时,
ZADD
的行为类似于ZINCRBY
。在此模式下,只能指定一个得分-元素对。
注意:GT、LT 和 NX 选项是互斥的。
可以精确表示的整数得分的范围
Redis 排序集合使用双精度 64 位浮点数来表示得分。在我们支持的所有架构中,这都被表示为IEEE 754 浮点数,它能够精确地表示从 -(2^53)
到 +(2^53)
(包括)的整数。更实际地说,从 -9007199254740992 到 9007199254740992(包括)的所有整数都可以完美地表示。更大的整数或分数在内部以指数形式表示,因此您可能只能获得设置为得分的十进制数或非常大的整数的近似值。
排序集合 101
排序集合按其得分以升序排序。同一个元素只存在一次,不允许重复元素。得分可以通过ZADD
(它将更新元素得分,并作为副作用,更新其在排序集合中的位置)和 ZINCRBY
(它可以用来相对于其先前值更新得分)来修改。
可以使用 ZSCORE
命令检索元素的当前得分,该命令还可以用于验证元素是否已经存在。
有关排序集合的介绍,请参阅 排序集合 上的数据类型页面。
具有相同得分的元素
虽然排序集中不能重复相同的元素,因为每个元素都是唯一的,但可以添加多个具有相同分数的不同元素。当多个元素具有相同的分数时,它们按字典顺序排序(它们仍然以分数作为第一关键字排序,但是,在本地,所有具有相同分数的元素按字典顺序排序)。
使用的字典排序是二进制的,它将字符串作为字节数组进行比较。
如果用户将所有元素插入具有相同分数(例如 0)的排序集中,则排序集中的所有元素都将按字典顺序排序,并且可以使用命令 ZRANGEBYLEX
对元素进行范围查询(注意:也可以使用 ZRANGEBYSCORE
根据分数范围查询排序集)。
示例
RESP2 响应
以下任一
- 空回复:如果操作由于与XX/NX/LT/GT 选项之一冲突而中止。
- 整数回复:当不使用CH 选项时,新成员的数量。
- 整数回复:当使用CH 选项时,新成员或更新成员的数量。
- 块字符串回复:当使用INCR 选项时,成员的更新分数。
RESP3 响应
以下任一
- 空回复:如果操作由于与XX/NX/LT/GT 选项之一冲突而中止。
- 整数回复:当不使用CH 选项时,新成员的数量。
- 整数回复:当使用CH 选项时,新成员或更新成员的数量。
- 双精度回复:当使用INCR 选项时,成员的更新分数。
历史
- 从 Redis 2.4.0 版本开始:接受多个元素。
- 从 Redis 3.0.2 版本开始:添加了
XX
、NX
、CH
和INCR
选项。 - 从 Redis 6.2.0 版本开始:添加了
GT
和LT
选项。