# 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 是changed的缩写)。更改的元素是添加的新元素和已更新分数的元素。因此,命令行中指定的与过去得分相同的元素不计算在内。注意:通常返回值
ZADD
只计算添加的新元素的数量。 - INCR:指定此选项时的
ZADD
行为类似于ZINCRBY
。在此模式下只能指定一个分数元素对。
注意:GT、LT和NX选项是互斥的。
# 可精确表达的整数分数范围
Redis 排序集使用双 64 位浮点数来表示分数。在我们支持的所有架构中,这表示为IEEE 754 浮点数-(2^53)
,它能够精确地表示介于两者之间的整数+(2^53)
。在更实际的情况下,-9007199254740992 和 9007199254740992 之间的所有整数都可以完美表示。较大的整数或分数在内部以指数形式表示,因此您可能只获得您设置为分数的十进制数或非常大整数的近似值。
# Sorted sets 101
排序集按其分数升序排序。同一个元素只存在一次,不允许有重复的元素。分数可以通过ZADD
更新元素分数来修改,作为副作用,它在排序集上的位置,并且ZINCRBY
可以用于更新相对于其先前值的分数。
可以使用命令检索元素的当前分数,ZSCORE
也可以用于验证元素是否已经存在。
有关排序集的介绍,请参阅排序集上的数据类型页面。
# 分数相同的元素
由于每个元素都是唯一的,因此不能在排序集中重复相同的元素,但可以添加多个具有相同 score 的不同元素。当多个元素具有相同的分数时,它们是按字典顺序排序的(它们仍然以分数作为第一个键进行排序,但是在局部,所有具有相同分数的元素都按字典顺序相对排序)。
使用的字典顺序是二进制的,它将字符串作为字节数组进行比较。
如果用户以相同的分数(例如 0)插入有序集合中的所有元素,则有序集合的所有元素都按字典顺序排序,并且可以使用命令对元素进行范围查询ZRANGEBYLEX
(注:也可以使用 ) 按分数范围查询排序集ZRANGEBYSCORE
。
# 返回
整数回复,具体来说:
- 当不使用可选参数时,添加到排序集中的元素数量(不包括分数更新)。
- 如果
CH
指定了该选项,则为已更改(添加或更新)的元素数。
如果INCR
指定了选项,则返回值将是Bulk string reply:
member
(双精度浮点数)的新分数表示为字符串,或者nil
操作是否中止(当使用XX
或NX
选项调用时)。
# 例子
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
redis>
# 历史
- 从 Redis 版本 2.4.0 开始:接受多个元素。
- 从 Redis 版本 3.0.2 开始:添加了、
XX
和NX
选项。CH``INCR
- 从 Redis 版本 6.2.0 开始:添加了
GT
andLT
选项。
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。