hash
是乙個string
型別的field
和value
的對映表。hash特別適合儲存物件,相對於將物件的每個欄位存成單個string型別。乙個物件儲存在hash型別中會占用更少的記憶體,並且可以更方便的訪問整個物件。
我們簡單舉個例項來描述下hash的應用場景,比如我們要儲存乙個使用者資訊物件資料,包含以下資訊:使用者id為查詢的key,儲存的value使用者物件包含姓名,年齡,生日等資訊,如果用普通的key/value結構來儲存,主要有以下2種儲存方式:
第一種方式將使用者id作為查詢key,把其他資訊封裝成乙個物件以序列化的方式儲存,這種方式的缺點是,增加了序列化/反序列化的開銷,並且在需要修改其中一項資訊時,需要把整個物件取回,並且修改操作需要對併發進行保護,引入cas等複雜問題。
第二種方法是這個使用者資訊物件有多少成員就存成多少個key-value對兒,用使用者id+對應屬性的名稱作為唯一標識來取得對應屬性的值,雖然省去了序列化開銷和併發問題,但是使用者id為重複儲存,如果存在大量這樣的資料,記憶體浪費還是非常可觀的。
因此,基於以上兩種方式的缺陷,redis提供的hash很好的解決了這個問題,redis的hash實際是內部儲存的value為乙個hashmap,並提供了直接訪問這個map成員的介面,如下圖:
也就是說,key仍然是使用者id, value是乙個map,這個map的key是成員的屬性名,value是屬性值,這樣對資料的修改和訪問都可以直接通過其內部map的key(redis裡稱內部map的key為field), 也就是通過key(使用者id) + field(屬性標籤) 就可以操作對應屬性資料了,既不需要重複儲存資料,也不會帶來序列化和併發修改控制的問題,也就很好的解決了
Redis儲存結構
redis現在是比較流行的快取資料庫,一般剛接觸的時候都會發現其可以儲存字串 string 雜湊表 hash 列表 list 集合 set 有序集合 sorted set 等。redis是乙個key value儲存,value可以包含上面列出的多種結構,但是key都是字串。也就是說key是strin...
Redis記憶體儲存結構分析
from redis a persistent key value database with built in net inte ce written in ansi c for posix systems 本文是基於 redis v2.2.4 版本進行分析.redis 是支援多key value...
redis的資料結構 儲存set
在redis中,我們可以將set型別看作為沒有排序的字元集合,和list型別一樣,我 們也可以在該型別的資料值上執行新增 刪除或判斷某一元素是否存在等操作。需要 說明的是,這些操作的時間是常量時間。set可包含的最大元素數是4294967295。和list型別不同的是,set集合中不允許出現重複的元...