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
存儲對象類數據。
在這裏插入圖片描述
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字段較多,遍歷整體數據的效率就會低,有可能成爲數據訪問的瓶頸。所以還是用什麼就拿什麼。

業務場景

  • 電商網站購物車實現

  • 在這裏插入圖片描述

  • 以客戶的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可用於搶購,限購,發放優惠券等等業務的數據存儲設計。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章