【Redis系列】Redis缓存

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

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


🚀我的专栏推荐

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

🚀我的承诺:

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

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

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


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

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

文章目录

缓存

我们知道计算机中对于硬件的访问速度来说,一般情况下:

|--------------------|
| CPU寄存器>内存>硬盘>网络 |

缓存是一个相对概念硬盘比网络更快,就可以使用硬盘作为网络的缓存;内存比硬盘更快,就可以使用内存作为硬盘的缓存;CPU寄存器比内存更快,就可以使用CPU寄存器作为内存的缓存。

但是对于硬件来说,访问速度越快的设备,价格越高,存储空间越小;所以缓存是更快,但是空间很小,只能存放一些访问频繁的数据。

Redis作为缓存

我们通常使用MySQL作为数据持久化的的工具来存储数据。虽然它功能强大但是性能不高(查询一次数据消耗的资源较多)

  • 数据库把数据存储在硬盘上,硬盘的IO速度并不快
  • 如果查询不能命中索引,就会遍历整张表,大大增加硬盘IO次数
  • 复杂查询,效率更低

因此,如果访问数据库的并发量很高(消耗大量资源 ),数据库的压力很大,从而导致数据库服务宕机。
为了解决并发量的问题,主要有两个思路:

  1. 开源:增加更多数据库实例,引入更多资源,构成数据库集群
  2. 节流:通过缓存减少并发量,降低数据库压力。

Redis作为数据库的缓存是一个比较常见的方案。因为Redis数据存在内存中,访问内存比硬盘快很多;其次Redis只支持简单的key-value存储,没有复杂的查询。

根据实际情况,在Redis中存放20%的热点数据,就应该可以响应80%的请求。
注意:缓存是⽤来加快"读操作"的速度的.如果是"写操作",还是要⽼⽼实实写数据库,缓存并不能提⾼性能。

缓存的更新策略

缓存中的数据需要响应80%的请求,那么如何才能筛选出这些数据呢?

添加热点数据

  1. 定期生成:.每隔一定周期,对于访问数据的频次进行统计,挑选出访问频次最高的前20%(这个值根据实际情况修改)数据。
  2. 实时生成:首先用户每次的查询如果在Redis中查到了,就直接返回
         如果没有查到,就去数据库中查询,同时把结果也写入到Redis中。
         经过一段时间后,Redis空间可能就放不下那么多数据,就触发淘汰策略,把访问频次较低的数据从Redis中删除
         这样持续一段时间,Redis中的数据就是热点数据了。

淘汰数据策略

  • 不进行数据淘汰策略(默认):不淘汰策略,写入时返回错误
  • 进行数据淘汰策略
      在设置了过期时间的数据中进行淘汰: volatile-random: 随机淘汰设置了过期时间的任意键值
                        volatile-ttl:优先淘汰更早过期的键值
                        volatile-lru:淘汰所有设置了过期时间的键值中,最久未使用的键值
                        volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值
      在所有数据范围内进行淘汰: allkeys-random:随机淘汰任意键值
                    allkeys-lru:淘汰整个键值中最久未使用的键值
                    allkeys-lfu(4.0后):淘汰整个键值中最少使用的键值。

缓存的应用问题

缓存预热

使用Redis作为MySQL 的缓存的时候,当Redis刚刚启动的时候,因为Redis自身是没有数据的,没有什么缓存数据,那么MySQL就可能被直接访问,从而造成较大压力。

因此就需要提前把热点数据准备好,直接写入到Redis中,使用Redis尽可能早的缓解数据库压力。虽然这份热点数据不一定那么准确,只要帮助MySQL抵挡一部分请求即可;随着程序运行,缓存中的热点会自动调整来适应当前业务。

缓存穿透

访问的数据在Redis和MySQL中都不存在。此时这样的key键不会放到缓存上,后续如果继续访问该数据依旧会直接访问到MySQL上,这就是缓存穿透。长此以往,数据库就会承担越来越多的请求。

解决方案:

  • 针对要查询的参数进行严格的合法校验,避免非法数据的查询
  • 针对数据库上也不存在的key,也可以存储到Redis中,value设置为空,避免后续继续访问
  • 使用布隆过滤器先判定key是否存在,在去查询

缓存雪崩

缓存雪崩:短时间内大量的key在缓存中失效,导致数据库压力暴增,可能导致宕机,直接奔溃。

大量key失效,主要有两种可能性:

  • Redis 挂了
  • Redis上大量的key同时过期

解决方案:

  • 部署高可用的Redis集群,完善监控报警体系
  • 不给key设置过期时间或者设置随机的过期时间

缓存击穿(瘫痪)

算是缓存雪崩的一种特殊情况。针对热点数据key突然同时大量过期,导致请求都直接访问到数据库上,甚至引起数据库宕机。

解决方案:

  • 基于统计的方式设置热点key,并设置永不过期
  • 进⾏必要的服务降级.例如访问数据库的时候使⽤分布式锁,限制同时请求数据库的并发数。

完结撒花!🎉

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

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

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

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


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

相关推荐
程农5 小时前
java计算机毕业设计婚纱摄影网站(附源码、数据库)
java·数据库·课程设计
川西胖墩墩5 小时前
网站开发完整流程梳理
大数据·数据库·架构·流程图·敏捷流程
我想发发发5 小时前
.deb格式软件包安装方式(Ubuntu 22.04为例)
linux·运维·ubuntu
cyber_两只龙宝5 小时前
LVS-NAT模式实验配置以及详解
linux·运维·云原生·lvs
海涛高软5 小时前
vmware虚拟机 ubuntu20.4手动设置静态IP
linux·运维·服务器
专注API从业者5 小时前
淘宝商品 API 接口架构解析:从请求到详情数据返回的完整链路
java·大数据·开发语言·数据库·架构
学嵌入式的小杨同学5 小时前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
VekiSon5 小时前
ARM架构——时钟系统与定时器详解
linux·c语言·arm开发·嵌入式硬件·架构
Mr -老鬼5 小时前
MySQL 8+ ibd文件恢复表结构实战:从ibd2sdi解析到数据重建
数据库·mysql