Redis資料結構之雜湊詳解
阿新 • • 發佈:2018-12-12
簡介
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 field , hincrbyfloat 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)
使用場景
- 關係型資料庫表記錄可以用Redis的雜湊型別進行儲存,一條記錄作為一個key-value,而每列屬性對應值可以作為field-value儲存在key-value中,也即採用雜湊型別儲存一條記錄,一張表可以根據主鍵區分,用多個雜湊型別的key-value進行儲存。
- 雜湊型別是稀疏的,而關係型資料庫是完全結構化的,非關係型資料庫和關係型資料庫,關係型資料庫插入一個新屬性列,則所有記錄都要插入並設定值,而非關係型資料庫裡的每條記錄的屬性列可以不相同,沒有結構關係
- 關係型資料庫可以做複雜的關係查詢,而Redis去模擬關係型複雜查詢開發困難,維護成本高。
合適的場景使用合適的技術,物件快取功能有三種實現方法:
- 每個屬性一個key 優點:簡單直觀,每個屬性都支援更新操作 缺點:佔用過多的key,記憶體佔用量大,同時物件的屬性內聚性比較差,一般不會在生成環境中使用
- 序列化字串型別:將物件資訊序列化成一個字串,然後用一個key儲存 優點:簡化程式設計,合理使用序列化技術可以提高記憶體使用率 缺點:序列化和反序列化有一定的開銷,同時每次更新一個屬性都要把全部資料取出進行反序列化,更新完再序列化到Redis中
- 雜湊型別:每個物件一個key,每個屬性一個field-value 優點:簡單直觀,使用合理可以減少記憶體空間 缺點:要控制雜湊在ziplist和hashtable兩種內部編碼之間的轉換,hashtable會消耗更多記憶體。