redis的第5种数据结构——zset

前面几篇文章写了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"

你可能感兴趣的:(redis的第5种数据结构——zset)