天天看點

Redis資料結構之hash

卑微小吳勵志寫部落格第20天。

昨天學習了一下redis資料結構中的string,學習了一些基礎的指令,以及用法。最主要的是使用場景。

思考:

用string存儲使用者的粉絲,部落格,關注等資訊時,有什麼問題?

set user: id:10086 {fans:1000,blogs:200,focus:60}

或者

set user: id:10086:fans 1000

set user: id:10086:fans 200

set user: id:10086:fans 60

這樣有什麼問題。

拿資料特别是修改資料的時候太笨重了,是以需要另一種更好的資料結構來存儲。

hash

存儲對象類資料。

Redis資料結構之hash

hash資料類型的基本操作

添加修改資料

  • hset key field value

擷取資料

  • hget key field
  • hgetall key

删除資料

  • hdel key field1 [field2]

添加修改多個資料

  • hmset key field1 value1 field2 value2 …

擷取多個值

-hmget key field1 field2 …

擷取hash表中字段的數量

  • hlen key

擷取hash表中是否存在指定的字段

  • hexists key field

hash資料類型的擴充操作

擷取所有的字段名和值

  • hkeys key
  • hvals key

設定指定字段的數值類型的值自增指定範圍

  • hincrby key field incrment
  • hincrbyfloat key field incrment

hash資料類型的操作注意事項

  1. hash類型filed對應的值隻能是字元串,不能嵌套。如果資料未找到,則傳回對應的值為(nil)
  2. 每個hash存儲的鍵值對是有限的,最多隻能存儲2^32-1個鍵值對。
  3. hash的存儲格式十分貼近對象的存儲形式,并且可以靈活的操作對象屬性。但是hash的設計初衷不是為了存儲對象,是以不要随便存儲對象。
  4. hgetall操作可以擷取全部屬性,但是如果内部的field字段較多,周遊整體資料的效率就會低,有可能成為資料通路的瓶頸。是以還是用什麼就拿什麼。

業務場景

  • 電商網站購物車實作
  • Redis資料結構之hash
  • 以客戶的id作為key,每一個使用者建立一個hash存儲結構。
  • 将商品編号作為field,數量作為value。
  • 添加商品:追加全新的field和value。
  • 删除商品:删除對應的field。
  • 增加商品數量:用hincrby,設定value的值。
  • 清空商品:删除key。

這樣做有什麼問題?這樣做是否加速了購物車的實作?

肯定不是的,商品的資訊還得去資料庫查,這裡隻有商品的編号和數量。

整改:把每條購物車中的商品紀錄儲存為兩條。

比如之前是: hset 001 g01 100;

改為: hmset 001 g01:nums 100 g01:info {…} ;

field1專門存儲數量,field2專門存儲商品資訊,用json儲存。 這樣所有的資料都可以從redis中讀取了。

還可以優化

如果使用者001和使用者002都買了一樣的商品,都會存儲相同的商品資訊info{…},可以把使用者商品資訊獨立出來。可以用類别作為key,分成諾幹個hash,這樣會更快一些。

擴充

hsetnx key field value

如果有值,加不進去,沒值才能加進來。避免用于購買相同的産品,重複在redis中加入商品資訊。

業務場景二

雙十一活動,銷售手機儲值卡的商家推出了30,50,100元的商品推出搶購活動,每種商品搶購上限1000張。

Redis資料結構之hash
  • 商家id作為key
  • 參與搶購的商品作為field
  • 産品數量作為value
  • 搶購時用降值的方法設定value

使用場景:

redis可用于搶購,限購,發放優惠券等等業務的資料存儲設計。

Redis資料結構之hash

繼續閱讀