Redis 入門 - 2(雜湊 + 列表)

Chinkiver發表於2018-02-26

繼續 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 ...

實踐

專案目標:

  1. 將原有的專案改變成 Hash 型別儲存,key為 task:$id,field為 title、content、createtime
  2. 使用 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 代表最右側倒數第二個元素

注意:

  1. 如果 start 大於 end,則返回空列表:(empty list or set)
  2. 如果 end 大於實際值,則返回至最右側元素
  3. RRANGE 命令

刪除元素

// 刪除 count 個值為 value 的元素
LREM key_name count value

實踐

專案目標:

  1. 使用列表儲存一份實際文章的 postid 清單,新增時同步新增,刪除時同步刪除
  2. 有兩個好處,方便獲取最新文章列表,方便分頁擷取
  3. 實現部落格的分頁

補充命令

獲得/設定 指定索引的元素值

// 返回索引 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.pngfile

目標

  1. 全域性任務編號依然為 task:count
  2. 定義一個任務清單為 task:list,當新增一個任務時新增,刪除一個任務時彈出
  3. 任務系統的功能包含:新增、分頁、更新和刪除
  4. 使用 Hash 儲存任務,其中key為 task:id:data,field為 title、content、important(A、B、C)、status(未完成(預設)、延期、完成)、summary
  5. 頁面為:主頁(list)、新增頁(create)、詳細頁(detail)(使用 task:id 檢視詳細內容)、完成頁(finish)
  6. 主頁(list)每頁顯示 10 條記錄,10 條記錄以上時分頁,並按時間倒排序
  7. 新增任務時,僅輸入 title(文字框)、content(文字框)、important(下拉),status 預設為“未完成”,且不可見
  8. 進入詳細頁後,可更新任務狀態並輸入 summary
  9. 任務 status 為“完成”時,將任務轉移至 task:finish:list 中,並可在完成頁中檢視

相關文章