卑微小吳勵志寫博客第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可用於搶購,限購,發放優惠券等等業務的數據存儲設計。