對 Redis 的基礎應用進行總結,並逐步使用 Laravel + Bootstrap + Redis 構建一個【個人任務管理系統】
前提
- Redis 入門 - 0(安裝、遠端訪問) | Laravel China 社群 - 高品質的 Laravel 開發者社群
- Redis 入門 - 0(圖形化管理工具) | Laravel China 社群 - 高品質的 Laravel 開發者社群
大綱
- 基本 key-value 操作
- 字串 String 型別 和 自增長 Integer 型別
- 雜湊 hash 型別
- 列表 list 型別
- 集合 set 型別
- 有序集合 sort set 型別
階段
時間計劃上為 4 個階段:
- Step 1:完成 1、2 兩個知識點的掌握,並構建一個最基本的 【個人任務管理系統】
- Step 2:繼續學習 3、4 兩個知識點,完善【個人任務管理系統】
- Step 3:繼續學習 5、6 兩個知識點,完成【個人任務管理系統】
- Step 4:明確目標,完整構建【個人任務管理系統】
約定 Redis 命令使用大寫來表示(但 Redis 自身並不區分大小寫)
Redis 的基礎
基礎命令
獲取 Key
// ?、*、[]、\x
KEYS [正規表示式]
// 獲取所有鍵(不建議在生產上執行此命令)
KEYS *
// 獲取所有以 post_xxxx 開頭的 key
KEYS post_*
判斷 Key 是否存在
// 存在返回整數型別 1,不存在則返回 0
EXISTS key_name
刪除 Key
// 返回刪除鍵的個數(整數型別)
DEL key_name
注意,DEL 不支援萬用字元,因此如果需要批量刪除需結合 Linux 管道命令實現。例如:
redis-cli DEL `redis-cli KEYS "post_*"`
Redis 中最基本的資料型別,最大儲存容量為 512 MB
基礎命令
賦值與取值
// 儲存 key_name = "value"
SET key_name value
// 獲取 key_name 的 "value"
// 注意:key_name 不存在時,返回空
GET key_name
// 同時賦值多個 key 或 獲取 多個 key 的 value
MSET key_name value [key_name2 value2 ...]
MGET key_name [key_name2 ...]
末尾追加值
// 返回追加後字串的總長度(Integer)
APPEND key_name value
如果 key_name 不存在,則建立一個 key_name-value,相當於執行 SET key_name value
獲取字串長度
// 返回字串的長度(Integer)
STRLEN key_name
可實現關係型資料庫裡的“自增”
基本命令
遞增與指定遞增值
// 讓 key_name 遞增,並返回遞增後的值(注意是 Integer)
INCR key_name
// INCR 是 INCRBY key_name 1 的特例
INCRBY key_name [每次遞增值]
如果 key_name 不存在時,會建立 key_name 並賦值為 0,再執行 INCR 命令。因此,第一次遞增後的結果是 1。
遞減與指定遞減值
// 遞減
DECR key_name
DECRBY key_name [每次遞減值]
如果 key_name 不存在時,會建立 key_name 並賦值為 0,再執行 DECR 命令。因此,第一次遞增後的結果是 -1。
【引申】Redis 是原子操作,絕不會出現多個客戶端同時執行 INCR 命令後,產生相同的遞增或遞減結果。
遞增指定浮點數
// 每次遞增一個雙精度浮點數
INCRBYFLOAT key_name [每次遞增浮點數]
位操作,我覺得可對理解 Redis 的底層操作有幫助,實際應用上最好別用。
但有一個地方要明確,Redis 同其他語言的設計一樣,當儲存過大偏移量的資料時,要簡化!例如:ID 以 6237000000000001 開始的編碼,直接儲存會造成記憶體的巨大浪費,應該寫個轉換函式,減去 6237000000000000 後,存 1。
設計一個【個人任務管理系統】專案,能夠將自己的日常事項進行管理:
- 一個介面,上半部分 Input,下半部分 List
- 使用 Laravel + Bootstrap + Redis 來實現
- Redis 中有一個統籌的自增 ID:task:count,由它生成全域性的 task id
- 實現 task 的儲存即可,因此儲存結構為:task:$id:title 和 task:$id:content($id 就是獲取到的 task:count)
- 功能上,僅實現 task 的新增即可