Redis 的基本資料型別 和 基礎應用場景
阿新 • • 發佈:2020-06-27
Redis 的基礎應用場景
- 獲取中獎使用者ID,隨機彈出之後集合中就不存在了【set】
- 儲存活動中中獎的使用者ID,保證同一個使用者不會中獎兩次【set】
- 儲存粉絲列表,value 為粉絲的使用者ID,score 是關注時間【zset】
- 儲存學生成績,value 為學生的ID,score 是考試成績【zset】
- 記錄帖子的點贊數、評論數、和點選率【hash】
- 記錄使用者的帖子ID列表,便於快速顯示使用者的帖子列表【zset】
- 記錄帖子的標題、摘要、作者和封面資訊,用於列表展示頁【hash】
- 記錄帖子的點贊ID列表,評論ID列表,用於顯示和去重計數【zset】
- 快取近期熱帖內容,減少資料庫壓力【hash】
- 記錄熱榜帖子ID列表,總熱榜和分類熱榜【zset】
- 收藏和貼子之間的關係【zset】
- 快取使用者的歷史行為,過濾惡意行為【zset,hash】
Redis 的基本資料型別
建值對:相當於字典的 key 和 value,支援簡單的增刪改查操作。
- set/get/exists/del
- mset/mget => 批量鍵值對
- expire => 設定過期時間
- setex => 5秒後過期,set + expire
- setnx => 如果不存在就建立,如果存在就建立不成功
- incr/incrby => value是整數,可以進行自增,自增是有範圍的。
- 獲取所有的key:keys *
- 清空所有的資料: flushall
127.0.0.1:6379> ## 單個鍵值對
127.0.0.1:6379> ## 設定 key 為 name,value 為 laowen
127.0.0.1:6379> set name laowen
OK
127.0.0.1:6379> get name ## 獲取
"laowen"
127.0.0.1:6379> exists name ## 檢查是否存在
(integer) 1
127.0.0.1:6379> del name ## 刪除
(integer) 1
127.0.0.1:6379> get name ## 獲取
127.0.0.1:6379> set name1 boy ## 設定
OK
127.0.0.1:6379> set name2 girl ## 設定
OK
127.0.0.1:6379> mget name1 name2 # 放回一個列表
1) "boy"
2) "girl"
127.0.0.1:6379> ## 批量新增多個
127.0.0.1:6379> mset name1 boy name2 girl name3 unknow
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknow"
127.0.0.1:6379> ## 設定過期時間
127.0.0.1:6379> set name a
OK
127.0.0.1:6379> get name
"a"
127.0.0.1:6379> expire name 5 # 5秒後過期
(integer) 1
127.0.0.1:6379> get name # 不到5秒
"a"
127.0.0.1:6379> get name # 5秒之後
(nil)
127.0.0.1:6379> ## 5秒後過期,set + expire
127.0.0.1:6379> setex name 5 aa
OK
127.0.0.1:6379> get name
"aa"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> ## 如果不存在就建立,如果存在就建立不成功
127.0.0.1:6379> setnx name a # 如果不存在就建立
(integer) 1
127.0.0.1:6379> get names
"a"
127.0.0.1:6379> setnx name b # 如果存在就建立不成功
(integer) 0
127.0.0.1:6379> get name # 沒有改變
"a"
127.0.0.1:6379> ## 計數
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> incrby age 5
(integer) 26
127.0.0.1:6379> get age
"26"
list 列表,注意它是連結串列而不是陣列。
Redis的列表結構常用於做非同步佇列使用。佇列是先進先出的資料結構,常用於訊息佇列和非同步邏輯處理,會確保元素的訪問順序性。
當列表彈出最後一個元素之後,該資料結構被自動刪除,記憶體被回收。
【佇列:右進左出】
- rpush 尾部追加
- llen 獲取長度
- lpop 頭部刪除
127.0.0.1:6379> ## 新增一個 books 佇列
127.0.0.1:6379> rpush books php java net golang
(integer) 4
127.0.0.1:6379> ## books 佇列尾部繼續新增內容
127.0.0.1:6379> rpush books c
(integer) 5
127.0.0.1:6379> ## books 佇列尾部繼續新增內容
127.0.0.1:6379> rpush books python
(integer) 6
127.0.0.1:6379> ## books 佇列尾部繼續新增內容
127.0.0.1:6379> rpush books vue
(integer) 7
127.0.0.1:6379> ## 獲取 books 佇列的長度
127.0.0.1:6379> llen books
(integer) 7
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"php"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"net"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"c"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
"vue"
127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
127.0.0.1:6379> lpop books
(nil)
127.0.0.1:6379>
【棧:右進右出】
- rpush 尾部追加
- llen 獲取長度
- rpop 從尾部刪除
127.0.0.1:6379> ## 新增一個 books 棧
127.0.0.1:6379> rpush books php java net golang
(integer) 4
127.0.0.1:6379> ## 獲取 books 棧的長度
127.0.0.1:6379> llen books
(integer) 4
127.0.0.1:6379> ## 彈出棧尾部的內容
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> ## 彈出棧尾部的內容
127.0.0.1:6379> rpop books
"net"
127.0.0.1:6379> ## 彈出棧尾部的內容
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> ## 彈出棧尾部的內容
127.0.0.1:6379> rpop books
"php"
127.0.0.1:6379> ## 彈出棧尾部的內容
127.0.0.1:6379> rpop books
(nil)
127.0.0.1:6379>
【慢操作】
【快速列表】
hash 雜湊字典
類似與字典,一個key對應一個value。適用於 key為標題,value為內容的儲存。當hash移除最後一個元素之後,該資料結構被自動刪除,記憶體被回收。
- hset key filed value 設定單個
- hget key filed 獲取單個
- hgetall key 獲取所有
- hdel key filed 刪除單個
- hlen key 獲取長度
- hmset key file value 批量設定
127.0.0.1:6379> ## 設定 name 的雜湊、注意 如果字串中包含空格、需要使用引號
127.0.0.1:6379> hset name wang wangzong
(integer) 1
127.0.0.1:6379> hset name wen wenzong
(integer) 1
127.0.0.1:6379> hset name zhang zhangzong
(integer) 1
127.0.0.1:6379> ## 獲取所有
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "wenzong"
5) "zhang"
6) "zhangzong"
127.0.0.1:6379> ## 獲取長度
127.0.0.1:6379> hlen name
(integer) 3
127.0.0.1:6379> ## 獲取單個
127.0.0.1:6379> hget name wen
"wenzong"
127.0.0.1:6379> ## 更新單個,成功返回0
127.0.0.1:6379> hset name wen wenzongbin
(integer) 0
127.0.0.1:6379> hget name wen
"wenzongbin"
127.0.0.1:6379> ## 更新單個,成功返回0
127.0.0.1:6379> hset name wen xiaowen
(integer) 0
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "xiaowen"
5) "zhang"
6) "zhangzong"
127.0.0.1:6379> ## 批量 set
127.0.0.1:6379> hmset name zhao zhaozong li lizong fei feizong
OK
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "xiaowen"
5) "zhang"
6) "zhangzong"
7) "zhao"
8) "zhaozong"
9) "li"
10) "lizong"
11) "fei"
12) "feizong"
127.0.0.1:6379> hget name wen
"xiaowen"
127.0.0.1:6379> ## 刪除單個
127.0.0.1:6379> hdel name wen
(integer) 1
127.0.0.1:6379> hget name wen
(nil)
127.0.0.1:6379>
set 集合
Redis 的集合內部是鍵值對,是無序的、唯一的。
- sadd key value => 新增
- smembers key => 獲取所有
- smembers key value => 檢查某個值是否存在
- scard key => 獲取長度
- spop key => 隨機彈出
127.0.0.1:6379> ## 新增一個,不存在,返回1
127.0.0.1:6379> sadd num 100
(integer) 1
127.0.0.1:6379> ## 新增一個,存在, 返回0
127.0.0.1:6379> sadd num 100
(integer) 0
127.0.0.1:6379> ## 新增多個
127.0.0.1:6379> sadd num 99 89
(integer) 2
127.0.0.1:6379> ## 獲取所有
127.0.0.1:6379> ## 和插入的順序是不一致的,因為 set 是無序的
127.0.0.1:6379> smembers num
1) "89"
2) "99"
3) "100"
127.0.0.1:6379> ## 查詢某個值是否存在 存在返回 1
127.0.0.1:6379> sismember num 100
(integer) 1
127.0.0.1:6379> ## 查詢某個值是否存在 不存在返回 0
127.0.0.1:6379> sismember num 90
(integer) 0
127.0.0.1:6379> scard num ## 獲取長度
(integer) 3
127.0.0.1:6379> spop num ## 隨機彈出一個
"100"
127.0.0.1:6379> spop num ## 隨機彈出一個
"89"
127.0.0.1:6379> spop num ## 隨機彈出一個
"99"
127.0.0.1:6379> spop num
(nil)
zset 有序列表
- zadd key score value => 新增
- zrange key 範圍 => 按 score 正序列出,引數為排名範圍
- zrevrange key 範圍 => 按 score 逆序列出,引數為排名範圍
- zcard key => 獲取長度,相當於 count()
- zscore key value => 獲取指定 value 的 score
- zrank key value => 獲取指定 value 的排名
- zrangebyscore key 範圍 => 根據 score 範圍取值
- zrem key value => 刪除指定 value 的 score
127.0.0.1:6379> ## 新增有序列表 zadd key score value
127.0.0.1:6379> ## score:成績
127.0.0.1:6379> ## key:fan
127.0.0.1:6379> ## value:wen
127.0.0.1:6379> zadd fan 100 wen
(integer) 1
127.0.0.1:6379> zadd fan 99 zhang
(integer) 1
127.0.0.1:6379> zadd fan 101 li
(integer) 1
127.0.0.1:6379> zadd fan 98 zhao
(integer) 1
127.0.0.1:6379> zadd fan 97 jin
(integer) 1
127.0.0.1:6379> ## zrange key 範圍
127.0.0.1:6379> ## 按 score 正序取出;引數為範圍
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> ## zrevrange key 範圍
127.0.0.1:6379> ## 按 score 逆序取出;引數為範圍
127.0.0.1:6379> zrevrange fan 0 -1
1) "li"
2) "wen"
3) "zhang"
4) "zhao"
5) "jin"
127.0.0.1:6379> ## zcard key 獲取總數。相當於 count()
127.0.0.1:6379> zcard fan
(integer) 5
127.0.0.1:6379> ## 獲取指定 value 的 score
127.0.0.1:6379> ## zscore key value
127.0.0.1:6379> zscore fan wen
"100"
127.0.0.1:6379> ## 獲取指定 value 的 排名
127.0.0.1:6379> ## zrank key value
127.0.0.1:6379> zrank fan wen
(integer) 3
127.0.0.1:6379> ## 獲取指定範圍的資料
127.0.0.1:6379> ## zrangebyscore key 範圍
127.0.0.1:6379> zrangebyscore fan 99 100
1) "zhang"
2) "wen"
127.0.0.1:6379> ## 獲取指定範圍的資料
127.0.0.1:6379> ## zrangebyscore key -inf inf 【只有value】
127.0.0.1:6379> ## zrangebyscore key -inf inf withscores 【value 和 score 同時返回】
127.0.0.1:6379> ## -inf/inf 代表 infinite,無窮大的意思,∞大
127.0.0.1:6379> zrangebyscore fan -inf inf
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> zrangebyscore fan -inf inf withscores
1) "jin"
2) "97"
3) "zhao"
4) "98"
5) "zhang"
6) "99"
7) "wen"
8) "100"
9) "li"
10) "101"
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> ## 刪除 value
127.0.0.1:6379> ## zrem key value
127.0.0.1:6379> zrem fan wen
(integer) 1
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "li"
127.0.0.1:6379>