
🚀 欢迎来到我的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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
