Redis 笔记(八)-ZSet(有序集合)类型详解
2021-08-09 本文已影响0人
yjtuuige
-
Zset(sorted_set有序集合):可排序的set集合。
在set基础上增加了一个值(set k1 v1、zset k1 scroe v1) -
共性:
redis有序集合zset,和集合set一样也是string类型元素的集合,且不允许重复的成员。 -
区别:不同的是
zset的每个元素,都会关联一个double类型的分数(score,分数可以重复)。redis正是通过分数来为集合中的成员进行从小到大的排序。
1、score相同:按字典顺序排序
2、有序集合的成员是唯一的,但分数 (score) 却可以重复。 -
内存模型
- 常用命令(以
z开头):
| 命令 | 说明 |
|---|---|
| zadd | 添加一个有序集合元素 |
| zcard | 返回集合的元素个数 |
| zcount | 计算指定区间 score 的成员个数 |
| zlexcount | 在有序集合中计算指定字典区间内成员数量 |
| zincrby | 给某个特定元素加分 score + |
| zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
| zrangebyscore | 排序:按照分数查找一个范围内的元素 |
| zrangebylex | 通过字典区间返回有序集合的成员 |
| zrank | 返回排名 |
| zrevrank | 倒序排名 |
| zrem | 移除某一个元素 |
| zremrangebylex | 移除有序集合中给定的字典区间的所有成员 |
| zremrangebyrank | 移除有序集合中给定的排名区间的所有成员 |
| zremrangebyscore | 移除有序集合中给定的分数区间的所有成员 |
| zscan | 迭代有序集合中的元素(包括元素成员和元素分值) |
| zscore | 显示某一个元素的分数 score |
- 添加元素:
zadd
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"
- 排序:升序
zrangebyscore,降序zrevrange
127.0.0.1:6379> zadd salary 3000 xh # 添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 5000 li
(integer) 1
127.0.0.1:6379> zadd salary 800 zs
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf # 显示全部的用户 从小 -inf 到大 +inf
1) "zs"
2) "xh"
3) "li"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 显示全部的用户并且附带 score 值
1) "zs" # zrangebyscore key min max
2) "800"
3) "xh"
4) "3000"
5) "li"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 3000 withscores # 显示 score 小于3000 的升序排序
1) "zs"
2) "800"
3) "xh"
4) "3000"
127.0.0.1:6379> zrevrange salary 0 -1 withscores # 降序,从大到进行排序,并显示 score
1) "li"
2) "5000"
3) "xh"
4) "3000"
5) "zs"
6) "800"
- 通过字典区间返回有序集合的成员:
zrangebylex
127.0.0.1:6379> zrangebylex salary - + # 通过字典区间返回所有的成员
1) "zs"
2) "xh"
3) "li"
127.0.0.1:6379> zrangebylex salary - + limit 0 2 # 分页,按索引显示查询结果,从 0 开始,显示 2 条
1) "zs"
2) "xh"
- 移除:
zrem
127.0.0.1:6379> zrange salary 0 -1
1) "zs"
2) "xh"
3) "li"
127.0.0.1:6379> zrem salary xh # 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zs"
2) "li"
- 返回集合的元素个数:
zcard
127.0.0.1:6379> zcard salary # 获取有序集合中的个数
(integer) 2
- 计算指定区间
score的成员个数:zcount
127.0.0.1:6379> zadd myset 1 hello 2 world 3 test
(integer) 3
127.0.0.1:6379> zcount myset 1 3 # 获取指定区间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
- 计算指定字典区间内成员数量:
zlexcount
127.0.0.1:6379> zlexcount myset - +
(integer) 4
- 给指定元素加分
score +:zincrby
127.0.0.1:6379> zadd myset 1 m1 2 m2 3 m3 4 m4
(integer) 4
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "m1"
2) "1"
3) "m2"
4) "2"
5) "m3"
6) "3"
7) "m4"
8) "4"
127.0.0.1:6379> zscore myset m4 # 显示指定元素的分数 scroe
"4"
127.0.0.1:6379> zincrby myset 5 m4 # 将 m4 的 score +5
"9"
127.0.0.1:6379> zscore myset m4
"9"
- 思路:
1、set排序:存储班级成绩表,工资表排序
2、权重处理:普通消息1,重要消息2,可带权重进行判断
3、排行榜应用实现:取TOP N测试