溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis中Hash類型有什么用

發(fā)布時間:2020-11-16 13:52:46 來源:億速云 閱讀:524 作者:小新 欄目:關系型數(shù)據(jù)庫

這篇文章將為大家詳細講解有關redis中Hash類型有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Hash類型是String類型的field和value映射表,或者說是一個String集合,它特別適合存儲對象,相比較而言,將一個對象類型存儲在Hash類型里要比存儲在String類型類,占用更小的內(nèi)存空間,并方便存取整個對象。

在Redis中,哈希類型是指鍵值本身又是一個鍵值對結構,形如:value={{field1,value1},{field2,value2},{fieldN,valueN}},

常用命令:

hget,hset,hgetall 等。

應用場景:

我們簡單舉個實例來描述下Hash的應用場景,比如我們要存儲一個用戶信息對象數(shù)據(jù),包含以下信息:

用戶ID,為查找的key,

存儲的value用戶對象包含姓名name,年齡age,生日birthday等信息。

如果用普通的key/value結構來存儲,主要有以下2種存儲方式:

第一種方式將用戶ID作為查找key,把其他信息封裝成一個對象以序列化的方式存儲,

如:set u001 "李三,18,20010101"

這種方式的缺點是,增加了序列化/反序列化的開銷,并且在需要修改其中一項信息時,需要把整個對象取回,并且修改操作需要對并發(fā)進行保護,引入CAS等復雜問題。

第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對,用用戶ID+對應屬性的名稱作為唯一標識來取得對應屬性的值,如:mset user:001:name "李三 "user:001:age18 user:001:birthday "20010101"

雖然省去了序列化開銷和并發(fā)問題,但是用戶ID為重復存儲,如果存在大量這樣的數(shù)據(jù),內(nèi)存浪費還是非??捎^的。

那么Redis提供的Hash很好的解決了這個問題,Redis的Hash實際是內(nèi)部存儲的Value為一個HashMap,并提供了直接存取這個Map成員的接口。

如:hmset user:001 name "李三" age 18 birthday "20010101"

也就是說,Key仍然是用戶ID,value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣對數(shù)據(jù)的修改和存取都可以直接通過其內(nèi)部Map的Key(Redis里稱內(nèi)部Map的key為field), 也就是通過key(用戶ID) + field(屬性標簽) 操作對應屬性數(shù)據(jù)了,既不需要重復存儲數(shù)據(jù),也不會帶來序列化和并發(fā)修改控制的問題。很好的解決了問題。這里同時需要注意,Redis提供了接口(hgetall)可以直接取到全部的屬性數(shù)據(jù),但是如果內(nèi)部Map的成員很多,那么涉及到遍歷整個內(nèi)部Map的操作,由于Redis單線程模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意。

實現(xiàn)方式:上面已經(jīng)說到Redis Hash對應Value內(nèi)部實際就是一個HashMap,實際這里會有2種不同實現(xiàn),這個Hash的成員比較少時Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲,而不會采用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數(shù)量增大時會自動轉成真正的HashMap,此時encoding為ht。

關于redis中Hash類型有什么用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI