目录
[ZADD 加入有序集](#ZADD 加入有序集)
[ZCARD 取成员数量](#ZCARD 取成员数量)
[ZCOUNT 计算区间成员数量](#ZCOUNT 计算区间成员数量)
[ZINCRBY 运算](#ZINCRBY 运算)
[ZRANGE 取区间成员(升序)](#ZRANGE 取区间成员(升序))
[ZRANGEBYSCORE 按分值排序取成员](#ZRANGEBYSCORE 按分值排序取成员)
[ZRANK 取成员排名](#ZRANK 取成员排名)
[ZREM 移除成员](#ZREM 移除成员)
[ZREMRANGEBYRANK 按位置区间批量移除](#ZREMRANGEBYRANK 按位置区间批量移除)
[ZREMRANGEBYSCORE 按分值区间移除](#ZREMRANGEBYSCORE 按分值区间移除)
[ZREVRANGE 取区间成员(降序)](#ZREVRANGE 取区间成员(降序))
[ZREVRANGEBYSCORE 取分值成员(逆序)](#ZREVRANGEBYSCORE 取分值成员(逆序))
[ZREVRANK 取成员提名(降序)](#ZREVRANK 取成员提名(降序))
[ZSCORE 取成员的分值](#ZSCORE 取成员的分值)
[ZUNIONSTORE 合并多个有序集](#ZUNIONSTORE 合并多个有序集)
[ZINTERSTORE 多个集合取成员交集](#ZINTERSTORE 多个集合取成员交集)
[ZSCAN 迭代](#ZSCAN 迭代)
ZADD 加入有序集
语法:ZADD key score member [[score member] [score member] ...]。
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
-
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
-
score 值可以是整数值或双精度浮点数。
-
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
-
当 key 存在但不是有序集类型时,返回一个错误。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd z1 8 a 1 b 5 c # 对一个不存在的key操作
(integer) 3
127.0.0.1:6379> zadd z1 2 b # 添加已存在的元素
(integer) 0
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> zadd name 1 a # 对非有序集key操作,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂订O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量。
返回值:
- 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
- 对非有序集key执行zadd命令,报错。
ZCARD 取成员数量
语法:ZCARD key。
返回有序集 key 的基数。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd z1 8 a 1 b 5 c
(integer) 3
127.0.0.1:6379> zcard z1 # 对非空有序集执行zcard命令
(integer) 3
127.0.0.1:6379> zcard z2 # 对不存在key执行zcard命令
(integer) 0
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> zcard name # 对非有序集执行zcard命令
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- 当 key 存在且是有序集类型时,返回有序集的基数。
- 当 key 不存在时,返回 0 。
- 当 key 不是有序集时,报错。
ZCOUNT 计算区间成员数量
语法:ZCOUNT key min max。
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
-
参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。
127.0.0.1:6379[9]> flushdb
OK
127.0.0.1:6379[9]> zrange s1 0 -1
(empty array)
127.0.0.1:6379[9]> zadd s1 2500 name1
(integer) 1
127.0.0.1:6379[9]> zadd s1 3000 name2
(integer) 1
127.0.0.1:6379[9]> zadd s1 5000 name3
(integer) 1
127.0.0.1:6379[9]> zrange s1 0 -1- "name1"
- "name2"
- "name3"
127.0.0.1:6379[9]> zcount s1 4000 5000 # 计算分数在4000-5000之间的元素
(integer) 1
时间复杂度O(log(N)+M), N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量。
返回值:
- score 值在 min 和 max 之间的成员的数量。
- key不是有序集,报错。
ZINCRBY 运算
语法:ZINCRBY key increment member。
为有序集 key 的成员 member 的 score 值加上增量 increment 。
-
increment 为正值为增加(score 可以是整数值或双精度浮点数)。
-
increment 为负值为减(score 可以是整数值或双精度浮点数)。
-
key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
-
当 key 不是有序集类型时,返回一个错误。
127.0.0.1:6379[9]> flushdb
OK
127.0.0.1:6379[9]> zadd s1 1000 name
(integer) 1
127.0.0.1:6379[9]> zscore s1 name
"1000"
127.0.0.1:6379[9]> zincrby s1 100 name
"1100"
127.0.0.1:6379> set s3 100
OK
127.0.0.1:6379> zincrby s3 1 name
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度为O(log(N))。
返回值:
- member 成员的新 score 值,以字符串形式表示。
- key不是有序集,报错。
ZRANGE 取区间成员(升序)
语法:ZRANGE key start stop [WITHSCORES]。
返回有序集 key 中,指定区间内的成员。
-
其中成员的位置按 score 值递增(从小到大)来排序(递减用 ZREVRANGE 命令)。
-
具有相同 score 值的成员按字典序来排列。
-
start和stop:0开始表示第一个成员,1表示第二个成员,以此类推。
-
start和stop:-1开始表示最后一个成员,-2表示倒数第二个成员,以此类推。
-
start大于stop或者start大于成员数量:返回空列表。
-
WITHSCORES选项:将有序集成员及其分值一起返回。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd s1 100 member1
(integer) 1
127.0.0.1:6379> zadd s1 200 member2
(integer) 1
127.0.0.1:6379> zrange s1 0 1 # 显示敬意0到1的成员- "member1"
- "member2"
127.0.0.1:6379> zrange s1 0 5 # stop 下标超出最大下标时的情况 - "member1"
- "member2"
127.0.0.1:6379> zrange s1 -1 -1 # 负数情况 - "member2"
127.0.0.1:6379> zrange s1 2 1 # start 大于 end 情况
(empty array)
127.0.0.1:6379> zrange s1 4 5 # start 大于 成员数量情况
(empty array)
127.0.0.1:6379> zrange s1 0 1 withscores # 添加withscores 选项情况 - "member1"
- "100"
- "member2"
- "200"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> zrange name 0 1 # 对非有序集合执行zrange命令情况
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
返回值:
- 指定区间内,带有 score 值(可选)的有序集成员的列表。
- 对非有序集合key操作报错。
ZRANGEBYSCORE 按分值排序取成员
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]。
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
-
具有相同 score 值的成员按字典序来排列。
-
可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
-
可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
-
默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间(小于或大于)。
-
min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
-
min大于max 或 min大于集合成员最大分时,返回空列表
127.0.0.1:6379[9]> flushdb
OK
127.0.0.1:6379[9]> zadd s1 2500 name1
(integer) 1
127.0.0.1:6379[9]> zadd s1 5000 name2
(integer) 1
127.0.0.1:6379[9]> zadd s1 12000 name3 # 初始化有序集合
(integer) 1
127.0.0.1:6379[9]> zrangebyscore s1 -inf +inf- "name1"
- "name2"
- "name3"
127.0.0.1:6379[9]> zrangebyscore s1 -inf +inf withscores - "name1"
- "2500"
- "name2"
- "5000"
- "name3"
- "12000"
127.0.0.1:6379[9]> zrangebyscore s1 -inf 3000 withscores - "name1"
- "2500"
127.0.0.1:6379[9]> zrangebyscore s1 5000 +inf withscores - "name2"
- "5000"
- "name3"
- "12000"
127.0.0.1:6379[9]> zrangebyscore s1 8000 +inf withscores - "name3"
- "12000"
127.0.0.1:6379[9]> zrangebyscore s1 8000 +inf - "name3"
127.0.0.1:6379[9]> ZRANGEBYSCORE s1 (8000 400000 - "name3"
时间复杂度O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。
返回值:
- 指定区间内,带有 score 值(可选)的有序集成员的列表。
- key不是有序集,报错。
ZRANK 取成员排名
语法:ZRANK key member。
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
-
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
-
如果想按分值递减排列,用 ZREVRANK 命令。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd s1 5 member1
(integer) 1
127.0.0.1:6379> zadd s1 3 member2
(integer) 1
127.0.0.1:6379> zadd s1 8 member3
(integer) 1
127.0.0.1:6379> zrank s1 member1 # 对有序集执行zrank情况
(integer) 1
127.0.0.1:6379> set s2 cxian
OK
127.0.0.1:6379> zrank s3 member1 # 对不存在key情况
(nil)
127.0.0.1:6379> set s3 beijing # 初始化非有序集合
OK
127.0.0.1:6379> zrank s3 bj # 对非有序集合情况
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(log(N))。
返回值:
- 如果 member 是有序集 key 的成员,返回 member 的排名。
- 如果 member 不是有序集 key 的成员 或 key 不存在,返回 nil 。
- 如果key不是有序集,报错
ZREM 移除成员
语法:ZREM key member [member ...]。
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
-
当 key 存在但不是有序集类型时,返回一个错误。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd s1 5 member1
(integer) 1
127.0.0.1:6379> zadd s1 3 member2
(integer) 1
127.0.0.1:6379> zadd s1 8 member3 # 初始化有序集
(integer) 1
127.0.0.1:6379> zrem s1 member1 member2 # 成员存在情况
(integer) 2
127.0.0.1:6379> zrem s1 member5 # 成员不存在情况
(integer) 0
127.0.0.1:6379> zrem s2 member5 # key不是有序集情况,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。
返回值:
- 被成功移除的成员的数量,不包括被忽略的成员。
- 成员不存在,返回 0。
- key不是有序集,报错。
ZREMRANGEBYRANK 按位置区间批量移除
语法:ZREMRANGEBYRANK key start stop。
移除有序集 key 中,指定排名(rank)区间内的所有成员。
-
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
-
参数 start 和 stop:以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
-
你参数 start 和 stop:以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set s1 1 member1
(error) ERR syntax error
127.0.0.1:6379> zadd s1 1 member1
(integer) 1
127.0.0.1:6379> zadd s1 4 member2
(integer) 1
127.0.0.1:6379> zadd s1 3 member3 # 初始化有序集
(integer) 1
127.0.0.1:6379> zremrangebyrank s1 1 1 # 有序集
(integer) 1
127.0.0.1:6379> zrange s1 0 -1 # 序出所有- "member1"
- "member2"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> zremrangebyrank name 1 1 # 非有序集key,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
返回值:
- 被移除成员的数量。
- key不是有序集,报错。
ZREMRANGEBYSCORE 按分值区间移除
语法:ZREMRANGEBYSCORE key min max。
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
-
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
-
score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看成员信息
- "verctor"
- "64"
- "lining"
- "65"
- "windows"
- "68"
- "unix"
- "71"
127.0.0.1:6379> zremrangebyscore grade 66 90 # 移除大于等于66 小于等于99 的成员
(integer) 2
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看成员信息 - "verctor"
- "64"
- "lining"
- "65"
时间复杂度O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
返回值:
- 被移除成员的数量。
- key不是有序集,报错。
ZREVRANGE 取区间成员(降序)
语法:ZREVRANGE key start stop [WITHSCORES]。
返回有序集 key 中,指定区间内的成员。
-
与ZRNANGE操作相似(详上翻见 ZRNANGE 命令)。
-
不同点:ZREVRANGE 成员的位置按 score 值递减(从大到小)来排列。
127.0.0.1:6379> zadd grade 65 lining
(integer) 1
127.0.0.1:6379> zadd grade 64 verctor
(integer) 1
127.0.0.1:6379> zadd grade 71 unix # 初始化集合
(integer) 1
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看有序集信息- "verctor"
- "64"
- "lining"
- "65"
- "unix"
- "71"
127.0.0.1:6379> zrevrange grade 0 -1 withscores # 执行zrevrange命令情况 - "unix"
- "71"
- "lining"
- "65"
- "verctor"
- "64"
127.0.0.1:6379> zrevrange name 0 -1 # 非有序集key执行zrevrange命令情况报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
返回值:
- 指定区间内,带有 score 值(可选)的有序集成员的列表。
- 对非有序集合key操作报错。
ZREVRANGEBYSCORE 取分值成员(逆序)
语法:ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]。
返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
-
与ZRNANGEBYSCORE操作相似(详上翻见 ZRANGEBYSCORE 命令)。
-
不同点:ZREVRANGEBYSCORE 成员的位置按 score 值递减(从大到小)来排列。
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看有序集合信息
- "verctor"
- "64"
- "lining"
- "65"
- "unix"
- "71"
127.0.0.1:6379> zrevrangebyscore grade 90 60 withscores # 执行zrevrangebyscore命令 - "unix"
- "71"
- "lining"
- "65"
- "verctor"
- "64"
时间复杂度O(log(N)+M), N 为有序集的基数, M 为结果集的基数。
返回值:
- 指定区间内,带有 score 值(可选)的有序集成员的列表。
- 对非有序集合key操作报错。
ZREVRANK 取成员提名(降序)
语法:ZREVRANK key member。
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
-
排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
-
使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名
127.0.0.1:6379> zrange grade 0 -1 # 查看集合信息
- "verctor"
- "lining"
- "unix"
127.0.0.1:6379> zrevrank grade lining # 取lining的排名
(integer) 1
127.0.0.1:6379> zrevrank grade baidu # 成员不存在
(nil)
127.0.0.1:6379> get grade1
(nil)
127.0.0.1:6379> zrevrank grade1 baidu # key不存在
(nil)
127.0.0.1:6379> zrevrank name baidu # key存在且不为有序集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(log(N))。
返回值:
- 如果 member 是有序集 key 的成员,返回 member 的排名。
- 如果 member 不是有序集 key 的成员 或 key 不存在,返回 nil 。
- key不是有序集,报错
ZSCORE 取成员的分值
语法:ZSCORE key member。
返回有序集 key 中,成员 member 的 score 值。
-
如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
127.0.0.1:6379> zrange grade 0 -1
- "verctor"
- "lining"
- "unix"
127.0.0.1:6379> zscore grade lining # 取存在成员的情况
"65"
127.0.0.1:6379> zscore grade lining2 # 取不存在成员的情况
(nil)
127.0.0.1:6379> zscore grade2 lining2 # 取不存在key不存在成员的情况
(nil)
127.0.0.1:6379> set grade3 beijing
OK
127.0.0.1:6379> zscore grade3 lining2 # 取存在key不为有序集全情况
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- member 成员的 score 值,以字符串形式表示。
- 返回nil:key不存在或成员不存在。
- 报错:key存在但不是有序集合。
ZUNIONSTORE 合并多个有序集
语法:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]。
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
-
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和。
-
选项 WEIGHTS:指给定有序集成员指定一个乘法因子,返回时指定的有序集成员的分值均乘以乘法因子。
-
没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
-
选项 AGGREGATE:两个以上有序集合有相同成员,以SUM|MIN|MAX 来取值,默认为SUM(SUM:分值相加;MIN:取最小的;MAX:取最大的)。
-
不存在的key似为空集合
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看有序集成员信息
- "verctor"
- "64"
- "lining"
- "65"
- "unix"
- "71"
127.0.0.1:6379> zrange grade2 0 -1 withscores # 查看有序集成员信息 - "ll"
- "30"
- "un"
- "35"
- "vc"
- "50"
127.0.0.1:6379> zunionstore dest 2 grade grade2 weights 2 2 # 执行zunionstore
(integer) 6
127.0.0.1:6379> zrange dest 0 -1 withscores # 查看 dest 信息 - "ll"
- "60" # 分值已乘以2(原数据是30)
- "un"
- "70" # 分值已乘以2(原数据是35)
- "vc"
- "100" # 分值已乘以2(原数据是50)
- "verctor"
- "128"
- "lining"
- "130"
- "unix"
- "142"
127.0.0.1:6379> del grade3
(integer) 1
127.0.0.1:6379> zunionstore dest 3 grade grade2 grade3 # 不存在key情况
(integer) 6
127.0.0.1:6379> zadd grade 12 ll # 在grade中添加和grade2相同的成员
(integer) 1
127.0.0.1:6379> zscore dest ll # 查看dest的成员ll的分值
"42"
127.0.0.1:6379> set grade3 beiging
OK
127.0.0.1:6379> zunionstore dest 3 grade grade2 grade3 # key不是有序集合情况
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。
返回值:
- 保存到 destination 的结果集的成员数量。
- key不为有序集,报错。
ZINTERSTORE 多个集合取成员交集
语法:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]。
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
-
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和。
-
WEIGHTS 和 AGGREGATE 选项的描述,参见 ZUNIONSTORE 命令。
-
key不存在似为空有序集。
127.0.0.1:6379> zinterstore dest 2 grade grade2 # 取两集合交集情况
(integer) 1
127.0.0.1:6379> zrange dest 0 -1 # 查看交集成员信息- "ll"
127.0.0.1:6379> del grade3
(integer) 1
127.0.0.1:6379> zinterstore dest 3 grade grade2 grade3 # 有不存在的key情况
(integer) 0
127.0.0.1:6379> lpush grade3 1
(integer) 1
127.0.0.1:6379> zinterstore dest 3 grade grade2 grade3 # 不为有序集合的key情况
(error) WRONGTYPE Operation against a key holding the wrong kind of value
- "ll"
时间复杂度O(N*K)+O(M*log(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。
返回值:
- 保存到 destination 的结果集的成员数量。
- key不为有序集合,报错。
ZSCAN 迭代
语法:ZSCAN key cursor [MATCH pattern] [COUNT count]。