目錄
2 hget key field,hgetall key:獲取數據
3 hdel key field1 [field2]:刪除數據
4 hmset key field1 value1 field2 value2……:添加修改多個數據
5 hmget key field1 hield2……:獲取多個數據
7 hexists key field:獲取hash表中是否存在指定字段
10 hincrby key field increment / hincrbyfloat key field incremnt:給字段的數值加上increment
在介紹hash之前我們首先介紹以下key的命名規範。
1 key的命名規範
由於redis中的熱點數據都是來源於關係型數據庫,因此要將數據對應起來,我們一般情況下key的命名規範如下:
表名:主鍵名:主鍵值:字段名
例如redis中有一條數據來自於關係型數據庫的表student中的id爲1001的學生的name
那麼我們就可以設置key的名字爲:
student:id:1001:name
這樣的命名規範一目瞭然,並且簡潔。
2 hash類型
如果需要在redis中存儲一個人的多個信息,我們可以採用Json的格式來存儲,但是如果有頻繁的更新操作那麼Json存儲就顯得笨重,但是如果我們分開來存儲,那麼但是它又是屬於一個整體,分開存儲又顯得不合適,如下所示:
如上圖:hash類型即是在value裏面再嵌套一個key-value,如下圖所示。
hash類型:
- 新的存儲需求;對一些列存儲的數據進行編組,方便管理,典型應對存儲對象信息
- 新的存儲結構:一個存儲控件保存多個鍵值對數據
- hash類型底層使用hash表結構實現數據存儲,如果field數量較少,存儲結構優化爲數組結構,如果filed比較多,使用HashMap結構。
3 基本操作
1 hset key field value:添加修改數據
2 hget key field,hgetall key:獲取數據
hget key field可以拿單個field裏面的數據,比如我們要拿user name 裏面的數據:
hgetall 通過key可以拿到所有的數據,單數爲field,雙數爲value.如下圖所示:
3 hdel key field1 [field2]:刪除數據
例如我們將user 裏面的weight刪除。
4 hmset key field1 value1 field2 value2……:添加修改多個數據
如上圖,name已經修改了,並且添加了weight爲50,hmset存在就改,不存在就加。
5 hmget key field1 hield2……:獲取多個數據
6 hlen key:獲取hash表中字段的數量
即user裏面有3個字段,即field的個數。
7 hexists key field:獲取hash表中是否存在指定字段
如上圖,user裏面存在字段age,不存在字段high。
8 hkeys key:獲取hash表的所有字段名
9 hvals key:獲取hash表中的所有字段值
10 hincrby key field increment / hincrbyfloat key field incremnt:給字段的數值加上increment
如上如,先通過hincrby給age加了10,再通過hincrbyfloat給age加了10.5
11 hsetnx key field value
只有field不存在的時候才設置它的值。
4 hash類型的操作注意事項
- hash類型value只能存string
- 每個hash可以存儲2的23次方減1個鍵值對
- hgetall可以獲取全部屬性,如果內部field過多,整體效率會降低。
5 hash的應用場景:購物車
電商中的購物車一般如下圖所示:
首先每個用戶都有自己的一個購物車,每個購物車裏面的商品不止一個,並且每個商品的數量也不止一個。
因此我們可以用用戶的id作爲key,用購物車商品的編號作爲field,用商品的數量作爲value。
同時相關的操作也可以實現,例如hget、hincrby可以對商品數量進行操作,hgetall可以對應全選操作,hdel對應刪除操作,hlen還可以得到購物車中的商品總數量。
如果我們僅討論購物車的redis存儲模型:添加、瀏覽、更改數量、刪除、清空等,那麼hash是完全可以實現這個模型的。
解決方案如下:
redis通常可以應用於搶購、限購、限量發放優惠卷、激活碼等業務的數據存儲設計。