前面几篇文章写了redis的4种数据结构——string / hash / list / set, 今天介绍下最后一种数据结构 zset。
zset 和 set 的不同之处是,zset多了一个score
zset的命令都是以Z开头
1.添加/更新 zadd key [nx|xx] [ch] [incr] score member …
默认情况下的返回值:成功添加的新成员的数量
> zadd z1 77 tom 90 mike 60 michael
(integer) 3
如果有序集合中已经存在score和member都相同的元素,不能添加:
> zadd z1 77 tom
(integer) 0
可以添加score一样的不同member:
> zadd z1 60 tony
(integer) 1
如果添加的member已存在,但是score不同,就更新score:
> zadd z1 88 tom
(integer) 0
Tom的score已从77更新到了88
更新member的score,不算新增,所以返回值是0
上面更新了返回的也是0,感觉怪怪的。
我想让他的返回值是元素改变的数量(也包括新增在内)怎么搞?
——CH:
> zadd z1 ch 87 tom
(integer) 1
如果我只想添加新元素,
对于已经存在的member,不要更新它的score,怎么搞?——NX
> zadd z1 nx ch 11 tom
(integer) 0
如果只想更新已存在的member的score,
对于不存在的member,不要新增,怎么搞?——XX
> zadd z1 xx ch 22 jerry
(integer) 0
INCR—— 功能同zincrby相同(下面)
> zadd z1 ch incr 6 tony
"66"
Tony的score从 60 更新成了 66
2.升序查看 zrange key start stop [withscores]
返回的结果是按score升序排列的:
> zrange z1 0 -1
1) "michael"
2) "tony"
3) "tom"
4) "mike"
> zrange z1 1 2
1) "tony"
2) "tom"
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tony"
4) "66"
5) "tom"
6) "87"
7) "mike"
8) "90"
3.降序查看 zrevrange key start stop [withscores]
> zrevrange z1 0 -1 withscores
1) "mike"
2) "90"
3) "tom"
4) "87"
5) "tony"
6) "66"
7) "michael"
8) "60"
4.查看member排名(升序) zrank key member
> zrank z1 tom
(integer) 2 排名第三
5.查看member排名(降序) zrevrank key member
> zrevrank z1 tom
(integer) 1 排名第二
6.查看指定score范围内的元素(升序排列)
zrangebyscore key min max [withscores] [limit offset count]
> zrangebyscore z1 60 87
1) "michael"
2) "tony"
3) "tom"
> zrangebyscore z1 60 87 withscores
1) "michael"
2) "60"
3) "tony"
4) "66"
5) "tom"
6) "87"
score在0~88之间的结果,偏移1位,取1位
> zrangebyscore z1 60 87 withscores limit 1 1
1) "tony"
2) "66"
7.查看指定score范围内的元素(降序排列)
zrevrangebyscore key max min [withscores] [limit offset count]
> zrevrangebyscore z1 87 60
1) "tom"
2) "tony"
3) "michael"
8.查看有序集合内元素个数 zcard key
> zcard z1
(integer) 4
9.查看有序集合内 member的score
> zscore z1 tony
"66"
10.增加member的score zincrby key increment member
> zincrby z1 10 tony
"76"
> zscore z1 tony
"76"
11.查看指定score范围内的元素个数 zcount key min max
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tony"
4) "76"
5) "tom"
6) "87"
7) "mike"
8) "90"
> zcount z1 70 90
(integer) 3
12.删除指定元素 zrem key member …
> zrem z1 tony
(integer) 1
> zrange z1 0 -1
1) "michael"
2) "tom"
3) "mike"
13.删除指定排名内的元素 zremrangebyrank key start stop
删除(升序)排名最后的一个元素
> zremrangebyrank z1 -1 -1
(integer) 1
> zrange z1 0 -1
1) "michael"
2) "tom"
14.删除指定score范围内的元素 zremrangebyscore key min max
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tom"
4) "87"
> zremrangebyscore z1 80 89
(integer) 1
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
15.zinterstore destination numkeys key… [weights…] [aggregate sum|min|max]
将numkeys个集合取交集 score*weight后 求和/取最小值/取最大值,weight默认为1 aggregate默认为sum
这里就用官网上的例子演示了:
先造一些数据,三个同学的半期考试成绩:
> zrange mid_test 0 -1 withscores
1) "Han Meimei"
2) "70"
3) "Li Lei"
4) "70"
5) "Tom"
6) "99.5"
期末考试成绩:
> Zrange fin_test 0 -1 withscores
1) "Han Meimei"
2) "75"
3) "Li Lei"
4) "88"
5) "Tom"
6) "99.5"
半期考试成绩和期末考试成绩相加
> zinterstore sumstore1 2 mid_test fin_test
(integer) 3
> zrange sumstore1 0 -1 withscores
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
期末考试的占比更大,将期末成绩*2再加上半期成绩:
> zinterstore sumstore2 2 mid_test fin_test weights 1 2
(integer) 3
> zrange sumstore2 0 -1 withscores
1) "Han Meimei"
2) "220"
3) "Li Lei"
4) "246"
5) "Tom"
6) "298.5"
查看他们2次考试的最高分:
> zinterstore maxstore3 2 mid_test fin_test aggregate max
(integer) 3
> zrange maxstore3 0 -1 withscores
1) "Han Meimei"
2) "75"
3) "Li Lei"
4) "88"
5) "Tom"
6) "99.5"
16.zunionstore destination numkeys key… [weights…] [aggregate sum|min|max]
将numkeys个集合取并集 score*weight后 求和/取最小值/取最大值 weight默认为1 aggregate默认为sum
造一组打工人的工资数据:
> zrange worker 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
再造一组 合伙人老板的工资数据(Tom既是员工,也是老板):
> zrange boss 0 -1 withscores
1) "tom"
2) "5500"
3) "bob"
4) "6000"
看看这个月大家工资多少:
> zunionstore salary 2 worker boss
(integer) 4
> zrange salary 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "bob"
6) "6000"
7) "tom"
8) "10500"
Tom既是员工,也是老板 领2份工资,最高
第二个月,老板熬鸡汤:做员工的不努力,老板就过不上想要的生活,听懂掌声。。。
打工人996,老板终于涨薪了。。。
> zunionstore salary2 2 worker boss weights 1 2
(integer) 4
> zrange salary2 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "bob"
6) "12000"
7) "tom"
8) "16000"
老板工资翻倍,员工工资不变。。。
看谁的工资最高(Tom 双重身份的例子,在这里不合适,理解意思即可):
> zunionstore salary3 2 worker boss aggregate max
(integer) 4
> zrange salary3 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5500"
7) "bob"
8) "6000"
17. zrangebylex key min max [limit offset count]
当有序集合的所有成员都具有相同的分值时(score必须相同,不然返回的结果不准确),
有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员
范围和数学中的范围表示方式有点类似:
+ 表示正无限, - 表示负无限,[表示闭区间,(表示开区间
> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
18. zlexcount key min max
这个的使用前提和zrangebylex一样,都是score相同的有序集合。
zrangebylex是取范围内的集合,zlexcount是统计个数
> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
> ZADD myzset 0 f 0 g
(integer) 2
> ZLEXCOUNT myzset - +
(integer) 7
> ZLEXCOUNT myzset [b [f
(integer) 5
19.zremrangebylex key min max
和上面类似,这个是删除范围内的元素
> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"