目录
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
1) "name1"
2) "name2"
3) "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的成员
1) "member1"
2) "member2"
127.0.0.1:6379> zrange s1 0 5 # stop 下标超出最大下标时的情况
1) "member1"
2) "member2"
127.0.0.1:6379> zrange s1 -1 -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 选项情况
1) "member1"
2) "100"
3) "member2"
4) "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
1) "name1"
2) "name2"
3) "name3"
127.0.0.1:6379[9]> zrangebyscore s1 -inf +inf withscores
1) "name1"
2) "2500"
3) "name2"
4) "5000"
5) "name3"
6) "12000"
127.0.0.1:6379[9]> zrangebyscore s1 -inf 3000 withscores
1) "name1"
2) "2500"
127.0.0.1:6379[9]> zrangebyscore s1 5000 +inf withscores
1) "name2"
2) "5000"
3) "name3"
4) "12000"
127.0.0.1:6379[9]> zrangebyscore s1 8000 +inf withscores
1) "name3"
2) "12000"
127.0.0.1:6379[9]> zrangebyscore s1 8000 +inf
1) "name3"
127.0.0.1:6379[9]> ZRANGEBYSCORE s1 (8000 400000
1) "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 # 序出所有
1) "member1"
2) "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 # 查看成员信息
1) "verctor"
2) "64"
3) "lining"
4) "65"
5) "windows"
6) "68"
7) "unix"
8) "71"
127.0.0.1:6379> zremrangebyscore grade 66 90 # 移除大于等于66 小于等于99 的成员
(integer) 2
127.0.0.1:6379> zrange grade 0 -1 withscores # 查看成员信息
1) "verctor"
2) "64"
3) "lining"
4) "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 # 查看有序集信息
1) "verctor"
2) "64"
3) "lining"
4) "65"
5) "unix"
6) "71"
127.0.0.1:6379> zrevrange grade 0 -1 withscores # 执行zrevrange命令情况
1) "unix"
2) "71"
3) "lining"
4) "65"
5) "verctor"
6) "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 # 查看有序集合信息
1) "verctor"
2) "64"
3) "lining"
4) "65"
5) "unix"
6) "71"
127.0.0.1:6379> zrevrangebyscore grade 90 60 withscores # 执行zrevrangebyscore命令
1) "unix"
2) "71"
3) "lining"
4) "65"
5) "verctor"
6) "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 # 查看集合信息
1) "verctor"
2) "lining"
3) "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
1) "verctor"
2) "lining"
3) "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 # 查看有序集成员信息
1) "verctor"
2) "64"
3) "lining"
4) "65"
5) "unix"
6) "71"
127.0.0.1:6379> zrange grade2 0 -1 withscores # 查看有序集成员信息
1) "ll"
2) "30"
3) "un"
4) "35"
5) "vc"
6) "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 信息
1) "ll"
2) "60" # 分值已乘以2(原数据是30)
3) "un"
4) "70" # 分值已乘以2(原数据是35)
5) "vc"
6) "100" # 分值已乘以2(原数据是50)
7) "verctor"
8) "128"
9) "lining"
10) "130"
11) "unix"
12) "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 # 查看交集成员信息
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
时间复杂度O(N*K)+O(M*log(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。
返回值:
- 保存到 destination 的结果集的成员数量。
- key不为有序集合,报错。
ZSCAN 迭代
语法:ZSCAN key cursor [MATCH pattern] [COUNT count]。