一、簡介
在 Redis 中,哈希類型是指值本⾝⼜是⼀個鍵值對結構,形如 key = "key",value = { { field1, value1 }, ..., {fieldN, valueN} },在Redis中為了與key - value作區分,將Hash類型鍵值對結構表示為filed - value。
String與Hash對比圖:
二、相關命令
2.1 hset 和 hget
hset: 設置 hash 中指定的字段(field)的值(value)。
語法:hset key field value [field value ...] 命令有效版本:2.0.0 之後
時間複雜度:插⼊⼀組 field 為 O(1), 插⼊ N 組 field 為 O(N) 返回值:添加的字段的個數。
也可以當修改字段的效果:
hget:獲取 hash 中指定字段的值。
語法:hget key filed
命令有效版本:2.0.0 之後
時間複雜度:O(1) 返回值:字段對應的值或者 nil。
2.2 hexists
hexists判斷 hash 中是否有指定的字段。
語法:hexists key filed
命令有效版本:2.0.0 之後
時間複雜度:O(1) 返回值:1 表⽰存在,0 表⽰不存在。
2.3 hdel
hdel刪除 hash 中指定的字段。
語法:hdel key field [field ...]
命令有效版本:2.0.0之後
時間複雜度:刪除⼀個元素為 O(1). 刪除 N 個元素為 O(N). 返回值:本次操作刪除的字段個數。
2.4 hkeys
hkeys獲取 hash 中的所有字段。
語法:hkeys key
命令有效版本:2.0.0 之後
時間複雜度:O(N), N 為 field 的個數. 返回值:字段列表。
2.5 hvals
hvals 獲取 hash 中的所有的值。
語法:hvals key
命令有效版本:2.0.0 之後
時間複雜度:O(N), N 為 field 的個數. 返回值:Hash所有value列表。
2.6 hgetall
hgetall獲取 hash 中的所有的字段和值。
語法:hgetall key
命令有效版本:2.0.0 之後
時間複雜度:O(N), N 為 field 的個數. 返回值:Hash所有字段和對應的值。
2.7 hmget
hmget⼀次獲取 hash 中多個字段的值。
hmget key field [field ...]
命令有效版本:2.0.0 之後
時間複雜度:只查詢⼀個元素為 O(1), 查詢多個元素為 O(N), N 為查詢元素個數. 返回值:字段對應的值或者 nil。
2.8 hlen
hlen獲取 hash 中的所有字段的個數。
語法:hlen key
命令有效版本:2.0.0 之後
時間複雜度:O(1) 返回值:字段個數。
2.9 hsetnx
hsetnx在字段不存在的情況下,設置 hash 中的字段和值。
語法:hsetnx key field value
命令有效版本:2.0.0 之後
時間複雜度:O(1) 返回值:1表⽰設置成功,0 表⽰失敗。
2.10 hincrby
hincrby將 hash 中字段對應的數值(必須是整數)添加指定的值。
語法: hincrby key field increment
命令有效版本:2.0.0之後
時間複雜度:O(1) 返回值:該字段變化之後的值。
2.11 hincrbyfloat
hincrbyfloathincrby的浮點數版本, 將 hash 中字段對應的數值(可以是整數和浮點數)添加指定的值。
語法: hincrbyfloat key field increment
命令有效版本:2.6.0之後
時間複雜度:O(1) 返回值:該字段變化之後的值。
2.12 小結
|
命令
|
執⾏效果
|
時間複雜度
|
|
hset key field value
|
設置值
|
O(1)
|
|
hget key field
|
獲取值
|
O(1)
|
|
hdel key field [field ...]
|
刪除 field
|
O(k), k 是 field 個數
|
|
hlen key
|
計算 field 個數
|
O(1)
|
|
hgetall key
|
獲取所有的 field-value
|
O(k), k 是 field 個數
|
|
hmget key field [field ...]
|
批量獲取 field-value
|
O(k), k 是 field 個數
|
|
hmset key field value [field value ...]
|
批量獲取 field-value
|
O(k), k 是 field 個數
|
|
hexists key field
|
判斷 field 是否存在
|
O(1)
|
|
hkeys key
|
獲取所有的 field
|
O(k), k 是 field 個數
|
|
hvals key
|
獲取所有的 value
|
O(k), k 是 field 個數
|
|
hsetnx key field value
|
設置值,但必須在 field 不存在時才能設置成功
|
O(1)
|
|
hincrby key field n
|
對應 field-value +n
|
O(1)
|
|
hincrbyfloat key field n
|
對應 field-value +n
|
O(1)
|
|
hstrlen key field
|
計算 value 的字符串⻓度
|
O(1)
|
三、編碼方式
哈希的內部編碼有兩種:
- ziplist(壓縮列表):當哈希類型元素個數⼩於 hash-max-ziplist-entries 配置(默認 512 個)、同時所有值都⼩於 hash-max-ziplist-value 配置(默認 64 字節)時,Redis 會使⽤ ziplist 作為哈希的內部實現,ziplist 使⽤更加緊湊的結構實現多個元素的連續存儲,所以在節省內存⽅⾯⽐ hashtable 更加優秀。
- hashtable(哈希表):當哈希類型⽆法滿⾜ ziplist 的條件時,Redis 會使⽤ hashtable 作為哈希的內部實現,因為此時 ziplist 的讀寫效率會下降,⽽ hashtable 的讀寫時間複雜度為 O(1)。
四、應用場景
4.1 作為緩存
存儲結構化的數據的時候,使用 hash 更加合適。
使用hash表示: