redis-7.hash型別

aliyeye發表於2021-01-17

儲存的困惑

物件類資料的儲存如果具有較頻繁的更新需求操作會顯得笨重
hash圖

hash型別

  • 新的儲存需求:對一系列儲存的資料進行編組,方便管理,典型應用儲存物件資訊
  • 需要的儲存結構:一個儲存空間儲存多個鍵值對資料
  • hash型別:底層使用雜湊表結構實現資料儲存UW7n6uXvje.png!large

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儲存

Ln4wgwiNn5.png!large

解決方案

  • 以客戶id作為key,每位客戶建立一個hash儲存結構儲存對應的購物車資訊
  • 將商品編號作為field,購買數量作為value進行儲存
  • 新增商品:追加全新的field與value
  • 瀏覽:遍歷hash
  • 更改數量:自增/自減,設定value值
  • 刪除商品:刪除field
  • 清空:刪除key

當前設計是否加速了購物車的呈現

當前僅僅時將資料儲存到了redis中,並沒有起到加速的作用,商品資訊還是需要二次查詢資料庫

  • 每條購物車中的商品記錄儲存成兩條field
    命名格式:商品id:nums
    儲存資料:數值
  • field2專門用於儲存購物車中顯示的資訊,包含文字描述,圖片地址,所屬商家資訊等(獨立hash)
    命名格式:商品id:info
    儲存資料:json
    //以下命令,已存在key不操作,不存在則新增
    hsetnx key field value
    Tips1:
  • redis應用於購物車資料儲存設計
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章