哈希这个类型几乎被所有主流的编程语言包含,它们的叫法可能是哈希、字典、关联数组、映射。在Redis中,哈希类型是指本身又是一个键值对结构,形如key="key",value={{field1,value1},...,{fieldn,valuen}},redis键值对和哈希类型二者的关系入下图:

注意:
哈希类型中的映射关系通常称为field-value,这主要是为了区分Redis整体的键值对(key-value)。
命令
HSET
语法:
shell
HSET key field value [field value ...]
功能:设置hash中的字段和值
命令有效版本:2.0.0以后
时间复杂度:O(K) K为插入的组数。
返回值:添加的字段的个数。
演示:
shell
127.0.0.1:6379> hset key field1 value1
(integer) 1
127.0.0.1:6379> hset key2 field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hget key field1
"value1"
127.0.0.1:6379>
HGET
语法:
shell
HGET key field
功能:获取hash中指定字段的值。
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:字段对应的值或者nil
演示:
shell
127.0.0.1:6379> hset key field1 value1
(integer) 1
127.0.0.1:6379> hset key2 field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hget key field1
"value1"
127.0.0.1:6379> hget key field3
(nil)
127.0.0.1:6379>
HEXISTS
语法:
shell
HEXISTS key fields
功能:判断hash中指定的字段是否存在。
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:1表示存在,0表示不存在。
演示:
shell
127.0.0.1:6379> hset key field value
(integer) 1
127.0.0.1:6379> hexists key field
(integer) 1
127.0.0.1:6379> hexists key field2
(integer) 0
127.0.0.1:6379>
HDEL
语法:
shell
HDEL key field [field ...]
功能:删除hash中指定的字段
命令有效版本:2.0.0以后
时间复杂度:O(K),K为删除的字段数目。
返回值:本次删除的字段个数。
演示:
shell
127.0.0.1:6379> hset key field value
(integer) 1
127.0.0.1:6379> hset key field2 value2
(integer) 1
127.0.0.1:6379> hset key field3 value3
(integer) 1
127.0.0.1:6379> hdel key field
(integer) 1
127.0.0.1:6379> hdel key field2 field3
(integer) 2
127.0.0.1:6379> hdel key field
(integer) 0
127.0.0.1:6379>
HKEYS
语法:
shell
HKEYS key
功能:获取hash中的所有字段。
命令有效版本:2.0.0以后
时间复杂度:O(N)
返回值:字段列表
演示:
shell
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hkeys key
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379>
HVALS
语法:
shell
HVALS key
功能:获取hash中的所有值
命令有效版本:2.0.0以后
时间复杂度:O(N)
返回值:所有值
演示:
shell
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hvals key
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379>
HGETALL
语法:
shell
HGETALL key
功能:获取hash中所有字段以及对应的值。
命令有效版本:2.0.0以后
时间复杂度:O(N)
返回值:所有的字段和值
演示:
shell
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hgetall key
1) "field1"
2) "value1"
3) "field2"
4) "value2"
5) "field3"
6) "value3"
127.0.0.1:6379>
HMGET
语法:
shell
HMGET key field [field ...]
功能:一次性获取hash中的多个字段的值
命令有效版本:2.0.0以后
时间复杂度:O(K),K为查询的字段个数
返回值:字段对应的值或者nil
演示:
shell
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hmget key field1 field2
2) "value1"
3) "value2"
127.0.0.1:6379>
HLEN
语法:
shell
HLEN key
功能:获取hash中所有字段的个数
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:字段个数
演示:
shell
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hlen key
(integer) 3
127.0.0.1:6379>
HSETNX
语法:
shell
HSETNX key field value
功能:在字段不存在的情况下,设置hash中的字段和值。
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:1表示设置成功,0表示失败。
演示:
shell
127.0.0.1:6379> hsetnx key field value
(integer) 1
127.0.0.1:6379> hsetnx key field value1
(integer) 0
127.0.0.1:6379> hget key field
"value"
127.0.0.1:6379>
HINCRBY
语法:
shell
HINCRBY key field increment
功能:将hash中的字段对应的数值添加指定的值。
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:该字段变化之后的值。
演示:
shell
127.0.0.1:6379> hset key field 114514
(integer) 1
127.0.0.1:6379> hincrby key field -114514
(integer) 0
127.0.0.1:6379> hincrby key field 999
(integer) 999
127.0.0.1:6379> hget key field
"999"
127.0.0.1:6379>
HINCRBYFLOAT
语法:
shell
HINCRBYFLOAT key field increment
功能:将hash中的字段对应的数值添加指定的值,数值可为浮点数。
命令有效版本:2.6.0以后
时间复杂度:O(1)
返回值:该字段变化之后的值。
演示:
shell
127.0.0.1:6379> hset key field 9.9
(integer) 1
127.0.0.1:6379> hincrbyfloat key field 9.9
"19.8"
127.0.0.1:6379> hget key field
"19.8"
127.0.0.1:6379>
内部编码
哈希的内部编码有两种:
-
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
-
hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。
注意: Redis 7.0 版本中引入了新数据结构,完全替代了 ziplist ,成为默认的紧凑编码格式。结构为:listpack