【Redis 系列】常用数据结构---Hash类型

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

Hash哈希

在之前学习数据结构的过程中,hash表是一个非常重要的算法,以后也会在各个方面使用。

哈希类型是指本身又是一个键值对的结构

因为redis本身就算一个键值对结构的数据库,所以使用哈希类型就相当于嵌套在redis的value中。 下图可以直观的观察到字符串类和哈希类型的区别。

注意:哈希类型中的映射关系通常称为field-value,⽤于区分Redis整体的键值对(key-value)

常用命令

HSET 和 HGET

HSET的作用:设置hash中指定的字段(filed)的值(value)

powershell 复制代码
#语法
hset key feild value [filed value]

时间复杂度:插⼊⼀组field为O(1),插⼊N组field为O(N)
返回值:添加的字段的个数

HGET的作用:获取hash中指定字段的值

powershell 复制代码
#语法
HGET key filed

返回值:返回给定字段的值。如果给定的字段或 key 不存在时,返回 nil

HEXISTS

作用:判断hash中是否有指定的字段

powershell 复制代码
HEXISTS key filed

时间复杂度:O(1)
返回值:1 表示存在,0表示不存在

HDEL

作用:删除hash中指定的字段

powershell 复制代码
HDEL key filed[filed...] 

时间复杂度:删除一个元素为O(1),删除N个元素为O(N)
返回值:本次删除操作的字段个数

HKEYS 和 HVALS

作用:获取hash中所有的字段(fileds)

powershell 复制代码
HKEYS key


返回值:字段列表

HVALS的作用:获取hash中所有的值

powershell 复制代码
HVALS key


返回值:所有的值
时间复杂度都是O(N),N为filed的个数

HGETALL

作用:获取hash中的所有的字段以及对应的值

powershell 复制代码
HGETALL key

时间复杂度:O(N),N为filed个数
返回值:字段和对应的值

注意:在使⽤HGETALL时,如果哈希元素个数⽐较多,会存在阻塞Redis的可能。

HMGET

作用:一次性获取hash中多个字段的值

powershell 复制代码
HMGET key filed[filed...] 

时间复杂度:只查询一个元素为O(1),查询当前多个元素为O(N),N为查询元素个数。
返回值:字段对应的值或者nil

HLEN

作用:获取hash中所有字段的个数

powershell 复制代码
HLEN key

返回值:字段个数

HSETNX

作用:在字段不存在的情况下,设置hash中字段和值

powershell 复制代码
HSETNX key filed value

返回值:1表示设置成功,0表示失败

HINCRBY

作用:将hash中字段对应的数值添加指定的值

powershell 复制代码
HINCRBY key filed increment

返回值:该字段变化后的值

总结:还有更多关于hash类型的命令,这里不再一一阐述,仔细观察可以发现,Hash 类型的很多命令和 String 类型非常相似,因为redis数据结构的演进中命名规律相同,方便学习者学会一种,能猜出其他;这种设计降低学习成本,理解这种命名规则后,学习其他数据结构就能"猜"出来,更加容易上手。

内部编码

listpack(7.0+)

  • zipist(压缩列表): 当哈希类型元素个数小于hash-max-ziplist-entries(默认512个)配置同时所有值都小于hash-max-ziplist-value(默认64字节)配置时,redis会使用ziplist作为哈希类型的内部实现。

  • 注意:在redis7.0+版本中出现了重大变化,listpack(列表包)代替了ziplist(压缩列表);listpack有更高的内存效率,更快的追加操作。

hashtable

  • hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现。

特点:Listpack 是 Redis 优化的内存紧凑结构,适合小数据量、内存敏感的场景,解决了 ziplist 的历史问题。Hashtable 是传统哈希表实现,提供 O(1) 高性能,适合大数据量、频繁查询的场景。

应用场景

关系型数据MySQL中表记录的两条⽤⼾信息,⽤⼾的属性表现为表的列,每条⽤⼾信息表现为⾏。上篇博客中string类型可以其实也可以使用JSON格式缓存用户信息,但是比较冗余;哈希类型更加直观,并且在更新操作上变得更灵活。

注意:哈希类型是稀疏的,而关系型数据库是结构化的,哈希类型的每个键可以有不同的filed,但是关系型数据库一旦有新的列,所有行都必须设置值。而且关系数据库可以做复杂的关系查询,⽽Redis要实现这些功能成本太高。

缓存方式对比

使用字符串类型,每个属性一个键

powershell 复制代码
set user:1:name zhangsan
set user:1:age 20
set user:1:city xaan 

优点:实现简单,针对个别属性变更也很灵活。
缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在Redis中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性

序列化字符串类型,JSON格式:

powershell 复制代码
set user:1 '{"name":"zhangsan","age":20,"city":"xaan"}'

优点:针对总是以整体作为操作的信息⽐较合适,编程也简单。
缺点:本⾝序列化和反序列需要⼀定开销,同时如果总是操作个别属性则⾮常不灵活

哈希类型

powershell 复制代码
hmset user:1 name zhangsan age 20 city xaan

优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。
缺点:需要控制哈希在listpack和hashtable两种内部编码的转换,可能会造成内存的较⼤消耗

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
Live&&learn2 小时前
Redis语法入门
数据库·redis
我就是你毛毛哥2 小时前
Linux 定时备份 MySQL 并推送 Gitee
linux·mysql
yuankunliu2 小时前
【分布式事务】4、分布式事务Seata的高级应用详解
分布式
忧郁蓝调263 小时前
Redis不停机数据迁移:基于 redis-shake 的跨实例 / 跨集群同步方案
运维·数据库·redis·阿里云·缓存·云原生·paas
旖旎夜光3 小时前
Linux(7)(下)
linux·学习
五阿哥永琪3 小时前
Redis的常用数据结构
数据结构·数据库·redis
吃螺丝粉3 小时前
zookeeper权限设置
linux·运维·服务器
java1234_小锋3 小时前
ZooKeeper集群中服务器之间是怎样通信的?
分布式·zookeeper·云原生
Sheep Shaun3 小时前
STL中的map和set:红黑树的优雅应用
开发语言·数据结构·c++·后端·c#