共計 1494 個字符,預計需要花費 4 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關 redis 中 Hash 類型有什么用,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Hash 類型是 String 類型的 field 和 value 映射表,或者說是一個 String 集合,它特別適合存儲對象,相比較而言,將一個對象類型存儲在 Hash 類型里要比存儲在 String 類型類,占用更小的內存空間,并方便存取整個對象。
在 Redis 中,哈希類型是指鍵值本身又是一個鍵值對結構,形如:value={{field1,value1},{field2,value2},{fieldN,valueN}},
常用命令:
hget,hset,hgetall 等。
應用場景:
我們簡單舉個實例來描述下 Hash 的應用場景,比如我們要存儲一個用戶信息對象數據,包含以下信息:
用戶 ID,為查找的 key,
存儲的 value 用戶對象包含姓名 name,年齡 age,生日 birthday 等信息。
如果用普通的 key/value 結構來存儲,主要有以下 2 種存儲方式:
第一種方式將用戶 ID 作為查找 key, 把其他信息封裝成一個對象以序列化的方式存儲,
如:set u001 李三,18,20010101
這種方式的缺點是,增加了序列化 / 反序列化的開銷,并且在需要修改其中一項信息時,需要把整個對象取回,并且修改操作需要對并發進行保護,引入 CAS 等復雜問題。
第二種方法是這個用戶信息對象有多少成員就存成多少個 key-value 對,用用戶 ID+ 對應屬性的名稱作為唯一標識來取得對應屬性的值,如:mset user:001:name 李三 user:001:age18 user:001:birthday 20010101
雖然省去了序列化開銷和并發問題,但是用戶 ID 為重復存儲,如果存在大量這樣的數據,內存浪費還是非常可觀的。
那么 Redis 提供的 Hash 很好的解決了這個問題,Redis 的 Hash 實際是內部存儲的 Value 為一個 HashMap,并提供了直接存取這個 Map 成員的接口。
如:hmset user:001 name 李三 age 18 birthday 20010101
也就是說,Key 仍然是用戶 ID,value 是一個 Map,這個 Map 的 key 是成員的屬性名,value 是屬性值,這樣對數據的修改和存取都可以直接通過其內部 Map 的 Key(Redis 里稱內部 Map 的 key 為 field), 也就是通過 key(用戶 ID) + field(屬性標簽) 操作對應屬性數據了,既不需要重復存儲數據,也不會帶來序列化和并發修改控制的問題。很好的解決了問題。這里同時需要注意,Redis 提供了接口 (hgetall) 可以直接取到全部的屬性數據, 但是如果內部 Map 的成員很多,那么涉及到遍歷整個內部 Map 的操作,由于 Redis 單線程模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意。
實現方式:上面已經說到 Redis Hash 對應 Value 內部實際就是一個 HashMap,實際這里會有 2 種不同實現,這個 Hash 的成員比較少時 Redis 為了節省內存會采用類似一維數組的方式來緊湊存儲,而不會采用真正的 HashMap 結構,對應的 value redisObject 的 encoding 為 zipmap, 當成員數量增大時會自動轉成真正的 HashMap, 此時 encoding 為 ht。
關于 redis 中 Hash 類型有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!