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

相关推荐
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试管理功能布局+交互优化方案
java·数据库·人工智能·spring boot·交互·ddd·tdd
IT大白2 小时前
4、数据库的事务
数据库
扑火的小飞蛾2 小时前
【Oracle Database 分区表】之间隔分区_11g(一)
数据库·oracle
Frank_refuel2 小时前
C++STL之set和map的接口使用介绍
数据库·c++·算法
l1t2 小时前
利用DeepSeek辅助翻译clickhouse SQL为DuckDB 格式求解Advent of Code 2025第10题 电子工厂 第二部分
数据库·人工智能·sql·clickhouse·duckdb
DarkAthena2 小时前
【GaussDB】分析函数性能优化案例-row_number改写
数据库·sql·oracle·性能优化·gaussdb
techdashen2 小时前
借助gh-ost,对MySQL大表进行表结构的变更
数据库·mysql
Lethehong2 小时前
破局Oracle迁移困局:破局Oracle迁移困局:直面兼容性与成本的隐性痛点
数据库·oracle
amazing-yuan2 小时前
Windows系统查看是否已安装Mysql,查找Mysql的安装地址,忘记root账号的密码时重置密码操作指引
数据库·windows·mysql