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
测试