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

相关推荐
roman_日积跬步-终至千里7 分钟前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科8 分钟前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦29 分钟前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
indexsunny43 分钟前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
晚霞的不甘2 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华22 小时前
mysql索引
数据库·mysql
2601_949593653 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__3 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql