1. 程式人生 > >Redis資料結構之雜湊詳解

Redis資料結構之雜湊詳解

簡介

Redis本身是鍵值對資料庫,但是值對應多種資料結構,其中就有雜湊(即鍵值對),值中的鍵值對稱為field和value。 在這裡插入圖片描述

基本命令

命令 命令描述
hset key field value 設定雜湊,和字串類似,也提供了hsetnx命令,不過是nx是針對field
hget key field 獲取值
hdel key field [field...] 刪除field,返回成功刪除的個數
hlen key 計算field的個數
hmget key field [field...]hmset key field value [field value....]
批量設定或獲取field-value
hexists key field 判斷field是否存在
hkeys key 獲取所有field
hvals key 獲取所有value
hgetall key 獲得所有field-value,如果field-value數量比較多,會存在阻塞Redis的可能,一般用hmget和hscan
hincrby key fieldhincrbyfloat key field 自增field操作,hincrbyfloat適用於整數和浮點數,而hincrby只適用於整數
hstrlen key field 計算value的字串長度

內部編碼

雜湊型別內部編碼有兩種: ziplist(壓縮列表):當雜湊型別元素的個數小於hash-max-ziplist-entries配置,預設是512,同時所有值都小於hash-max-ziplist-value配置時,預設是64位元組,Redis會使用ziplist作為雜湊型別的內部實現,ziplist使用更加緊湊的結構實現多個元素的連續儲存,所以在節省記憶體方面比hashtable更加優秀。 hashtable(雜湊表):當雜湊型別無法滿足ziplist的條件時,Redis會使用hashtable作為雜湊的內部實現,因為此時ziplist的讀寫效率會下降,而hashtable的讀寫時間複雜度為O(1)

使用場景

  1. 關係型資料庫表記錄可以用Redis的雜湊型別進行儲存,一條記錄作為一個key-value,而每列屬性對應值可以作為field-value儲存在key-value中,也即採用雜湊型別儲存一條記錄,一張表可以根據主鍵區分,用多個雜湊型別的key-value進行儲存。 在這裡插入圖片描述
  2. 雜湊型別是稀疏的,而關係型資料庫是完全結構化的,非關係型資料庫和關係型資料庫,關係型資料庫插入一個新屬性列,則所有記錄都要插入並設定值,而非關係型資料庫裡的每條記錄的屬性列可以不相同,沒有結構關係
  3. 關係型資料庫可以做複雜的關係查詢,而Redis去模擬關係型複雜查詢開發困難,維護成本高。

合適的場景使用合適的技術,物件快取功能有三種實現方法:

  1. 每個屬性一個key 優點:簡單直觀,每個屬性都支援更新操作 缺點:佔用過多的key,記憶體佔用量大,同時物件的屬性內聚性比較差,一般不會在生成環境中使用
  2. 序列化字串型別:將物件資訊序列化成一個字串,然後用一個key儲存 優點:簡化程式設計,合理使用序列化技術可以提高記憶體使用率 缺點:序列化和反序列化有一定的開銷,同時每次更新一個屬性都要把全部資料取出進行反序列化,更新完再序列化到Redis中
  3. 雜湊型別:每個物件一個key,每個屬性一個field-value 優點:簡單直觀,使用合理可以減少記憶體空間 缺點:要控制雜湊在ziplist和hashtable兩種內部編碼之間的轉換,hashtable會消耗更多記憶體。