1. 獲取中獎用戶ID,隨機彈出之後集合中就不存在了【set】 2. 存儲活動中中獎的用戶ID,保證同一個用戶不會中獎兩次【set】 3. 存儲粉絲列表,value 為粉絲的用戶ID,score 是關註時間【zset】 4. 存儲學生成績,value 為學生的ID,score 是考試成績【zset】... ...
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 ## 獲取 (nil) 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>