首頁  >  文章  >  資料庫  >  redis什麼時候用hash類型

redis什麼時候用hash類型

尚
原創
2019-07-04 16:16:093649瀏覽

redis什麼時候用hash類型

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相關知識,請造訪Redis使用教學欄位!

以上是redis什麼時候用hash類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn