hash類型的應用場景 —— Redis實戰經驗
hash類型是一個string類型的field和value的映射表,每個 hash 可以存儲 232 - 1 鍵值對(40多億),hash類型主要有以下應用場景。
1. 購物車
以用戶id為key,商品id為field,商品數量為value,恰好構成了購物車的3個要素,如下圖所示。
2. 存儲對象
hash類型的(key, field, value)的結構與對象的(對象id, 屬性, 值)的結構相似,也可以用來存儲對象。
在介紹string類型的應用場景時有所介紹,string + json也是存儲對象的一種方式,那麽存儲對象時,到底用string + json還是用hash呢?
兩種存儲方式的對比如下表所示。
string + json | hash | |
效率 | 很高 | 高 |
容量 | 低 | 低 |
靈活性 | 低 | 高 |
序列化 | 簡單 | 復雜 |
當對象的某個屬性需要頻繁修改時,不適合用string+json,因為它不夠靈活,每次修改都需要重新將整個對象序列化並賦值,如果使用hash類型,則可以針對某個屬性單獨修改,沒有序列化,也不需要修改整個對象。比如,商品的價格、銷量、關註數、評價數等可能經常發生變化的屬性,就適合存儲在hash類型裏。
當然,不常變化的屬性存儲在hash類型裏也沒有問題,比如商品名稱、商品描述、上市日期等。但是,當對象的某個屬性不是基本類型或字符串時,使用hash類型就必須手動進行復雜序列化,比如,商品的標簽是一個標簽對象的列表,商品可領取的優惠券是一個優惠券對象的列表(如下圖所示)等,即使以coupons(優惠券)作為field,value想存儲優惠券對象列表也還是要使用json來序列化,這樣的話序列化工作就太繁瑣了,不如直接用string + json的方式存儲商品信息來的簡單。
綜上,一般對象用string + json存儲,對象中某些頻繁變化的屬性抽出來用hash存儲。
hash類型的常用命令可參考http://www.runoob.com/redis/redis-hashes.html
加入string類型的應用場景後的思維導圖如下。
hash類型的應用場景 —— Redis實戰經驗