儲存的困惑
物件類資料的儲存如果具有較頻繁的更新需求操作會顯得笨重
hash型別
- 新的儲存需求:對一系列儲存的資料進行編組,方便管理,典型應用儲存物件資訊
- 需要的儲存結構:一個儲存空間儲存多個鍵值對資料
hash型別:底層使用雜湊表結構實現資料儲存
hash儲存結構最佳化
- 如果field數量較少,儲存結構最佳化為類資料結構
- 如果field數量較多,儲存結構使用HashMap結構
hash型別資料的基本操作
- 新增/修改資料
hset key field value
- 獲取資料
hget key field hgetall key
- 刪除資料
hdel key field1 [field2]
- 新增/修改多個資料
hmset key field1 value1 field2 value2 ...
- 獲取多個資料
hmget key field1 field2 ...
- 獲取雜湊表中欄位的數量
hlen key
- 獲取雜湊表中是否存在指定的欄位
hexists key field
hash型別資料擴充套件操作
- 獲取雜湊表中所有的欄位名或欄位值
hkeys key hvals key
- 設定指定欄位的數值資料增加指定範圍的值
hincrby key field increment hincrbyfloat key field increment
hash型別資料操作的注意事項
- hash型別下的value只能儲存字串,不允許儲存其他資料型別,不存在巢狀現象。如果資料未獲取到,對應的值為(nil)
- 每個hash可以儲存2^32-1(2的32次方減1)個鍵值對
- hash型別十分貼近物件的資料儲存形式,並且可以靈活新增刪除物件屬性。但hash設計初衷不是為了儲存大量物件而設計的,切記不可濫用,更不可以將hash作為物件列表使用
- hgetall操作可以獲取全部屬性,如果內部field過多,遍歷整個資料效率就會很低,有可能成為資料訪問瓶頸
業務場景
電商網站購物車設計與實現
業務分析
- 僅分析購物車的redis儲存模型新增 瀏覽 更改數量 刪除 清空
- 購物車於資料庫間持久化同步(不討論)
- 購物車於訂單間關係(不討論)
提交購物車:讀取資料生成訂單
商家臨時價格調整:隸屬於訂單級別 - 未登入使用者購物車資訊儲存(不討論)
cookie儲存
解決方案
- 以客戶id作為key,每位客戶建立一個hash儲存結構儲存對應的購物車資訊
- 將商品編號作為field,購買數量作為value進行儲存
- 新增商品:追加全新的field與value
- 瀏覽:遍歷hash
- 更改數量:自增/自減,設定value值
- 刪除商品:刪除field
- 清空:刪除key
當前設計是否加速了購物車的呈現
當前僅僅時將資料儲存到了redis中,並沒有起到加速的作用,商品資訊還是需要二次查詢資料庫
- 每條購物車中的商品記錄儲存成兩條field
命名格式:商品id:nums
儲存資料:數值 - field2專門用於儲存購物車中顯示的資訊,包含文字描述,圖片地址,所屬商家資訊等(獨立hash)
命名格式:商品id:info
儲存資料:json
Tips1://以下命令,已存在key不操作,不存在則新增 hsetnx key field value
- redis應用於購物車資料儲存設計
本作品採用《CC 協議》,轉載必須註明作者和本文連結