卑微小吳勵志寫部落格第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
存儲對象類資料。
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資料類型的操作注意事項
- hash類型filed對應的值隻能是字元串,不能嵌套。如果資料未找到,則傳回對應的值為(nil)
- 每個hash存儲的鍵值對是有限的,最多隻能存儲2^32-1個鍵值對。
- hash的存儲格式十分貼近對象的存儲形式,并且可以靈活的操作對象屬性。但是hash的設計初衷不是為了存儲對象,是以不要随便存儲對象。
- hgetall操作可以擷取全部屬性,但是如果内部的field字段較多,周遊整體資料的效率就會低,有可能成為資料通路的瓶頸。是以還是用什麼就拿什麼。
業務場景
- 電商網站購物車實作
- 以客戶的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張。
- 商家id作為key
- 參與搶購的商品作為field
- 産品數量作為value
- 搶購時用降值的方法設定value
使用場景:
redis可用于搶購,限購,發放優惠券等等業務的資料存儲設計。