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