一、簡介

在 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表示: