繼續 Redis 入門的 Day - 2。這次將學習 Redis 的兩個最最基本的結構化資料型別
雜湊,是種“鍵 + 欄位 + 欄位值”的資料結構。實際應用上,可以用它將一個“大塊”的內容,分割為一個個的“小塊”內容,進而提高效率和效能,減少執行時的資源浪費
所有雜湊命名均以 “H” 開頭
基礎命令
設定與獲取
// 設定雜湊的 key + field + value
// 注意:field_value 只能是字串,當然不支援型別巢狀
HSET key_name field_name field_value
// 獲取雜湊的 key with field
HGET key_name field_name
批量設定與批量獲取
// 批量設定
HMSET key_name field_name1 field_value1 field_name2 field_value2 ...
// 批量獲取
HMGET key_name field_name1 field_name2 ...
獲取全部
// 獲取 key_name 下的全部 fields 和 values
HGETALL key_name
判斷欄位是否存在
// 存在返回 1,否則返回 0(包括鍵不存在或欄位不存在)
HEXISTS key_name field_name
當欄位不存時設定
// 不存在則設定 返回 1;存在則什麼也不做,返回 0
HSETNX key_name field_name field_value
增加數字
// 返回(Integer)增加後的數值。如果欄位不存在,則建立,返回 1
HINCRBY key_name field_name 每次遞增的數值
刪除欄位
HDEL key_name field_name1 field_name2 ...
實踐
專案目標:
- 將原有的專案改變成 Hash 型別儲存,key為 task:$id,field為 title、content、createtime
- 使用 postid 可以檢視 task 詳細內容的連結
補充命令
只獲取欄位名或欄位值
// 獲取 key_name 下的所有欄位名
HKEYS key_name
// 獲取 key_name 下的所有欄位值
HVALS key_name
獲取欄位數量
// 返回欄位的數量
HLEN key_name
儲存一個有序字串列表,為雙向連結串列,越接近兩端的元素讀取速度越快。實際應用上,可以用來表示“最新的XXX”、“新鮮事”、“日誌”等場景,以突出列表的連結串列優勢
基礎命令
增加元素
// 這裡的 key_name 可以理解為 list_name
// 向左邊新增元素,返回增加元素後的列表長度(該命令具備批量新增)
LPUSH key_name value [value ...]
// 向右邊新增元素,返回增加元素後的列表長度(該命令具備批量新增)
RPUSH key_name value [value ...]
注意:多個 values 時,則順次新增,且可以有相同 value 值
彈出元素
注意:“彈出”後,該元素將從列表中消失。執行步驟為:先從列表中移除元素,後返回該元素。
// 從左邊移除一個元素,返回列表值
LPOP key_name
// 從右邊移除一個元素,返回列表值
RPOP key_name
可以實現棧和佇列的功能:
// 棧(Strack)
LPUSH my_strack A B C
LPOP my_strack // C 彈出
// 佇列(Queue)
LPUSH my_queue A B C
RPOP my_queue // A 彈出
獲取元素個數
// 返回列表的長度
LLEN key_name
獲取列表片段
// 返回 start 至 end 間的所有元素,包括 end
LRANGE key_name start end
同時,也支援負索引,表示從右側開始計算序列。 -1 代表最右側元素,-2 代表最右側倒數第二個元素
注意:
- 如果 start 大於 end,則返回空列表:(empty list or set)
- 如果 end 大於實際值,則返回至最右側元素
- 無
RRANGE
命令
刪除元素
// 刪除 count 個值為 value 的元素
LREM key_name count value
實踐
專案目標:
- 使用列表儲存一份實際文章的 postid 清單,新增時同步新增,刪除時同步刪除
- 有兩個好處,方便獲取最新文章列表,方便分頁擷取
- 實現部落格的分頁
補充命令
獲得/設定 指定索引的元素值
// 返回索引 index 處的 value
LINDEX key_name index
這樣就可以將 list 當做陣列來使用
// 將索引為 index 的值設定為 value
LSET key_name index value
只保留列表指定片段
// 用法同 LRANGE,但只保留指定範圍內的元素
LTRIM key_name start end
可以用來實現日誌的管理,例如“動態日誌”,只保留100條最新的動態日誌記錄,就可以:
LPUSH logs value
LTRIM logs 0 100
向列表中插入元素
// 先查詢 find_value 的元素,再根據 BEFORE|AFTER 在 find_value 前或後插入 set_value 值,返回撥整後的列表元素個數
LINSERT key_name BEFORE|AFTER find_value set_value
將元素從一個列表轉到另一個列表
// 從 form_key_name 列表的最右側彈出一個元素,再在最左側新增至 to_key_name 列表中
RPOPLPUSH from_key_name to_key_name
Redis-2.png
目標
- 全域性任務編號依然為 task:count
- 定義一個任務清單為 task:list,當新增一個任務時新增,刪除一個任務時彈出
- 任務系統的功能包含:新增、分頁、更新和刪除
- 使用 Hash 儲存任務,其中key為 task:id:data,field為 title、content、important(A、B、C)、status(未完成(預設)、延期、完成)、summary
- 頁面為:主頁(list)、新增頁(create)、詳細頁(detail)(使用 task:id 檢視詳細內容)、完成頁(finish)
- 主頁(list)每頁顯示 10 條記錄,10 條記錄以上時分頁,並按時間倒排序
- 新增任務時,僅輸入 title(文字框)、content(文字框)、important(下拉),status 預設為“未完成”,且不可見
- 進入詳細頁後,可更新任務狀態並輸入 summary
- 任務 status 為“完成”時,將任務轉移至 task:finish:list 中,並可在完成頁中檢視