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

相关推荐
李广坤16 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest3 天前
数据库SQL学习
数据库·sql
jnrjian3 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
十月南城3 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark