redis之zset
概述
redis有序集合,保留了集合中元素不能重复的特性,不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据(在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1)。
使用语法
基础
1
2
3
4
5
6
7
8
9
10
|
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zscore myset one # 获取成员分数
"1"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
127.0.0.1:6379> zadd salary 2500 xiaohong #添加三条数据
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 5500 snailsir
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #显示所有用户 从小到大!
1) "xiaohong"
2) "zhangsan"
3) "snailsir"
127.0.0.1:6379> zrevrange salary 0 -1 #显示所有用户 从大到小!
1) "snailsir"
2) "zhangsan"
3) "xiaohong"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示所有的用户并且附带成绩
1) "xiaohong"
2) "2500"
3) "zhangsan"
4) "5000"
5) "snailsir"
6) "5500"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #显示工资小于2500员工升序排列
1) "xiaohong"
2) "2500"
|
移除指定元素
1
2
3
4
5
6
7
8
9
10
11
12
13
|
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohong"
2) "zhangsan"
3) "snailsir"
127.0.0.1:6379> zrem salary xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "snailsir"
127.0.0.1:6379> zremrangebyrank score 0 0 # 移除有序集中,指定排名(rank)区间内的所有成员
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "harry"
|
获取有序集合中的个数
1
2
|
127.0.0.1:6379> zcard salary
(integer) 2
|
获取指定区间成员数量
1
2
3
4
5
6
7
8
|
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 word 3 snaislir
(integer) 2
127.0.0.1:6379> zcount myset 1 3
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
|
返回有序集中指定成员的排名
1
2
3
4
5
6
7
|
127.0.0.1:6379> zrank score harry
(integer) 2
127.0.0.1:6379> zrank score starsky
(integer) 1
127.0.0.1:6379> zrank score will
(integer) 0
127.0.0.1:6379>
|
迭代有序集合
1
2
3
4
|
127.0.0.1:6379> zscan score 0 match t*
1) "0"
2) 1) "tony"
2) "95"
|
应用场景
排行榜
list与zset类型做排行榜区别:实时更新与定时更新的区别
list适合非动态的榜单
抢票加速包
用户买了加速包,就给分数加分,分值越高抢到票的几率越大
数据结构
跳跃表
zset是基于跳跃表实现的
基于链表优化,实现的跳跃表

如果我们找22,只需要经过7->19->22就可以查找到了