Redis中的Hash哈希

哈希这个类型几乎被所有主流的编程语言包含,它们的叫法可能是哈希、字典、关联数组、映射。在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

相关推荐
这个DBA有点耶2 小时前
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
数据库·分布式·dba
这个DBA有点耶4 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
胡写代码4 小时前
数据库审计字段,别再每张表各写一套了——我统一成这 6 个字段
数据库
SelectDB8 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence9 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头9 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
草莓熊Lotso11 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠13 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_19 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家21 小时前
OSS 文件上传的几个风险点和解决方案
数据库