Redis五大資料型別---有序集合Zset(sorted set)
阿新 • • 發佈:2021-11-17
## 一、簡介
1. zset與set異同
- 相同之處:
都是==沒有重複元素==的字串集合
- 不同之處:
有序集合zset的每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了 。
因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個範圍的元素。
訪問有序集合的中間元素也是非常快的,因此你能夠使用有序集合作為一個沒有重複成員的智慧列表。
## 二、常用命令 ##### 1、zadd `語法:zadd <key><score1><value1><score2><value2>…`將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
```bash
127.0.0.1:6379> zadd myzset 1 one #在set集合基礎上增加了score。
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
```
##### 2、zrange `語法:zrange <key><start><stop> [withscores]` 返回有序集 key 中,下標在`<start><stop>`之間的元素
```bash
127.0.0.1:6379> zrange myzset 0 -1 #獲取myzset裡的全部值
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> zrange myzset 0 1 #獲取myzset裡下標在0-1的元素
1) "one"
2) "two"
127.0.0.1:6379> zrange myzset 0 3 #獲取myzset裡下標在0-3的元素
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379>
```
##### 3、zrangebyscore `語法:zrangebyscore key minmax [withscores] [limit offset count]` 返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序整合員按 score 值遞增(從小到大)次序排列。
```bash
127.0.0.1:6379> zadd salary 1000 zhangsan # 測試資料
(integer) 1
127.0.0.1:6379> zadd salary 2000 lisi
(integer) 1
127.0.0.1:6379> zadd salary 3000 wangwu
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf # 顯示整個有序集
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 顯示整個有序集及成員的 score 值
1) "zhangsan"
2) "1000"
3) "lisi"
4) "2000"
5) "wangwu"
6) "3000"
127.0.0.1:6379> zrangebyscore salary -inf 2000 withscores # 顯示工資 <=2000 的所有成員
1) "zhangsan"
2) "1000"
3) "lisi"
4) "2000"
127.0.0.1:6379> zrangebyscore salary (2000 5000 # 顯示工資大於 2000 小於等於 5000 的成員
1) "wangwu"
127.0.0.1:6379>
```
##### 4、zrevrangebyscore `語法:zrevrangebyscore key maxmin [withscores] [limit offset count]`同上,改為從大到小排列。
```bash
127.0.0.1:6379> zadd salary 1000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 2000 lisi
(integer) 1
127.0.0.1:6379> zadd salary 3000 wangwu
(integer) 1
127.0.0.1:6379> zrevrangebyscore salary +inf -inf # 逆序排列所有成員
1) "wangwu"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> zrevrangebyscore salary 5000 3000 # 逆序排列薪水介於 5000 和 2000 之間的成員
1) "wangwu"
127.0.0.1:6379>
```
##### 5、zincrby `語法:incrby <key><increment><value>` 為元素的score加上增量
```bash
127.0.0.1:6379> zadd myzset 1 why
(integer) 1
127.0.0.1:6379> zincrby myzset 12 why #分數加上增量12
"13"
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "why"
2) "13"
127.0.0.1:6379>
```
##### 6、zrem `語法:zrem <key><value>` 刪除該集合下,指定值的元素。
```bash
127.0.0.1:6379> zrange test 0 -1 withscores #測試資料
1) "www.baidu.com"
2) "1"
3) "www.cainiao.com"
4) "1"
5) "www.guge.com"
6) "1"
127.0.0.1:6379>
127.0.0.1:6379> zrem test www.cainiao.com #移除指定的值
(integer) 1
127.0.0.1:6379> zrange test 0 -1 withscores #檢視test裡面的資料
1) "www.baidu.com"
2) "1"
3) "www.guge.com"
4) "1"
127.0.0.1:6379> zrem test www.cainiao.com #移除不存在的值
(integer) 0
127.0.0.1:6379>
```
##### 7、zcount `語法:zcount <key><min><max>·統計該集合,分數區間內的元素個數
```bash
127.0.0.1:6379> zadd myzset 1 hello #新增測試資料
(integer) 1
127.0.0.1:6379> zadd myzset 1 why
(integer) 1
127.0.0.1:6379> zadd myzset 2 zhansgan
(integer) 1
127.0.0.1:6379> zadd myzset 3 lisi
(integer) 1
127.0.0.1:6379> zcount myzset 1 3 #統計資料為1-3的值
(integer) 4
127.0.0.1:6379>
```
##### 8、zrank `語法:zrank <key><value>` 返回有序集中指定成員的排名。其中有序整合員按分數值遞增(從小到大)順序排列。
```bash
127.0.0.1:6379> zrange salaory 0 -1 withscores #測試資料
1) "zhangsan"
2) "2000"
3) "lisi"
4) "3000"
5) "wangwu"
6) "5000"
127.0.0.1:6379> zrank salaory lisi #獲得李四的排名為第二,0為第一名
(integer) 1
127.0.0.1:6379> zrank salaory zhangsan
(integer) 0
127.0.0.1:6379> zrank salaory wangwu
(integer) 2
127.0.0.1:6379>
```
## 三、使用場景
- 1、排行榜系統
有序集合比較典型的使用場景就是排行榜系統。例如學生成績的排名。某視訊(部落格等)網站的使用者點贊、播放排名、電商系統中商品的銷量排名等。
```bash
127.0.0.1:6379> zadd user:ranking 10 article1 #發表一篇文章,獲得十個點贊
(integer) 1
127.0.0.1:6379> zincrby user:ranking -1 article1 #我覺得他寫的不好,所以取消點贊
"9"
127.0.0.1:6379> zscore user:ranking article1 #檢視文章的點贊數
"9"
127.0.0.1:6379> zrange user:ranking 0 9 #展示點贊最多的十篇文章
1) "article1"
127.0.0.1:6379>
```
- 2、電話號碼(姓名)排序
```bash
127.0.0.1:6379> zadd phone 0 13100111100 0 13110114300 0 13132110901
(integer) 3
127.0.0.1:6379> zadd phone 0 13200111100 0 13210414300 0 13252110901
(integer) 3
127.0.0.1:6379> zadd phone 0 13300111100 0 13310414300 0 13352110901
(integer) 3
127.0.0.1:6379> zrangebylex phone - + #獲取所有號碼
1) "13100111100"
2) "13110114300"
3) "13132110901"
4) "13200111100"
5) "13210414300"
6) "13252110901"
7) "13300111100"
8) "13310414300"
9) "13352110901"
127.0.0.1:6379> zrangebylex phone [132 (133 #獲取132號段
1) "13200111100"
2) "13210414300"
3) "13252110901"
127.0.0.1:6379> zrangebylex phone [132 (134 #獲取132,133號段
1) "13200111100"
2) "13210414300"
3) "13252110901"
4) "13300111100"
5) "13310414300"
6) "13352110901"
127.0.0.1:6379>
```
[更多關於zset命令檢視官網](https://www.redis.net.cn/tutorial/3512.html)
## 二、常用命令 ##### 1、zadd `語法:zadd <key><score1><value1><score2><value2>…`將一個或多個 member 元素及其 score 值加入到有序集 key 當中。