哈希類型?
哈希類型的命令
hset
設置key指定的字段(field)的值(value)?
也可以設置多組field和value
hget?
獲得哈希中指定字段的值
如果該字段為空或者key為空則返回nil
hexists
判斷哈希中是否有該字段的值
如果有則會返回1,否則返回0
?
hdel
刪除哈希中該字段對應的值
返回本次刪除的字段個數
也可以一次刪除多個哈希中的字段
hkeys
獲得哈希中的全部字段
hvals
獲得哈希中的所有值
hgetall
獲得哈希中的全部字段和全部的值
hmget
一次性獲得哈希中的多個字段
hlen
獲得哈希中所有字段的個數
hstrlen
獲得哈希中字段的長度
hsetnx
字段不存在下,設置哈希中的字段和值
返回1表示設置成功,0表示設置失敗
hincrby
對哈希中對應字段的值添加指定的值(+/-)
hincrfloat
對哈希中的字段中的值進行浮點數運算
?
注:如果只對單個的字段進行命令作用,時間復雜度為O(1),否則是O(N)N為字段(field)的個數
帶H的命令必須保證作用的是哈希類型
內部編碼
哈希的內部編碼一共有兩種:ziplist(壓縮列表)和hashtable(哈希表)
當field的個數較少,并且沒有特別大的value,內部編碼為ziplist,否則會自動轉換為hashtable
壓縮的本質,是對數據進行重新編碼
可以再redis的配置文件中修改默認的配置(ziplist -> hashtable)
?
使用場景
用戶信息的保存
關系型數據庫保存用戶信息
userId | uesrName | age |
1 | zhangsan | 2 |
2 | lisi | 3 |
映射關系表示用戶信息
相?于使?JSON格式的字符串緩存用戶信息,哈希類型變得更加直觀,并且在更新操作上變得更靈活。
作為緩存
如果使用String(json)的格式表示UserInfo
- 只是想獲取某個field,或者修改某個field
- 就需要把整個json都讀出來,操作field,轉成json字符串,再寫回去
如果用哈希的方式表示UserInfo
- 就可以使用field表示對象的屬性
- 此時修改和獲取任何一個屬性就會十分的方便
注:使用hash進行field的讀取和修改,確實是十分的方便,但是會使其內部編碼再ziplist和hashtable中進行切換,造成內存的消耗
?
希望能對大家有所幫助!!!!!!!
?
?