当前位置: 首页 > news >正文

Redis--缓存击穿、缓存穿透、缓存雪崩

缓存击穿

什么是缓存击穿呢?

        在高并发的场景下,一个热点的缓存数据在redis中突然失效(过期或被删除时,所有的读请求都会直接落在数据库上,导致数据库瞬间压力剧增,严重时可能会造成数据库宕机。这种情况就是所谓的“缓存击穿”。(重点在于同一时间访问某一个热点的key数据库中有,redis中没有)

失效的可能原因

  1. 热点数据过期:如果缓存中的某些数据是访问非常频繁的热点数据,这些数据在缓存中过期后,如果有大量请求同时访问,这些请求都会穿透到数据库。
  2. 缓存数据被误删除:由于操作不当或系统bug等原因,缓存中的热点数据被误删除,也会导致缓存击穿。

解决方案

         1.设置热点数据永不过期:对于一些访问非常频繁的热点数据,可以设置为永不过期,然后通过其他机制(如定时任务或后台线程)去更新这些数据。

         2.设置缓存预热:在系统启动或者低峰期时,预先将一些热点数据加载到缓存中,这样在系统高峰期时,这些热点数据就已经存在于缓存中了,从而避免了缓存击穿的发生。

         3.分布式锁:在分布式系统中,可以使用分布式锁来控制只有一个服务实例去数据库查询数据并更新缓存,其他服务实例则等待锁释放。这种方式需要引入分布式锁的实现(这个在我的另一篇博客有写到分布式锁 ——》http://t.csdnimg.cn/50hUT)

缓存雪崩

什么是缓存雪崩呢?

        缓存雪崩指的是缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机的现象。就是当缓存中的大量数据在同一时间失效,且这些数据的访问量又非常大时,所有的请求都会直接打到数据库上,导致数据库负载急剧增加,可能引发数据库崩溃,进而影响整个系统的正常运行。(重点在于同一时间访问大量的失效的key数据库中有,redis中没有)

失效的可能原因

  1. 缓存数据的过期策略:如果大量的缓存数据被设置为在同一时间点过期,那么在这个时间点,这些缓存数据将同时失效,导致大量的请求直接打到数据库上。
  2. 缓存服务器的故障:如果缓存服务器出现故障,所有原本应该由缓存处理的请求都会直接转发到数据库,给数据库带来巨大的压力。

解决方案

         1.设置合理的过期时间:避免大量的缓存数据在同一时间点过期。可以通过随机设置过期时间或者为不同类型的缓存数据设置不同的过期策略来实现。

         2.设置缓存预热:在系统启动或者低峰期时,提前将热点数据加载到缓存中,避免在高峰期时缓存数据失效导致大量请求直接打到数据库上。

缓存穿透

什么是缓存穿透呢?

    缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,而查询的结果在数据库中也不存在,因此不会写入缓存。这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。(重点在于访问某个的key数据库中没有,redis中没有,所以每次只能去数据库中查询)

发生的情况

  1. 当用户或系统查询一个在数据库中不存在的数据时,由于缓存中没有缓存该数据(因为数据本身不存在),每次查询都会失败并直接访问数据库。
  2. 如果攻击者利用这个漏洞进行大量伪造ID的请求,将极大地增加数据库的负担,甚至可能导致数据库崩溃。

解决方案

         1.输入参数校验:在请求到达前,对请求参数进行合法性验证,如对请求的ID进行有效性检查,过滤掉无效或恶意的请求。

         2.缓存空对象:对于查询为空的结果,也将其缓存起来(但设置较短的过期时间),这样下次查询相同的数据时可以直接从缓存中返回空对象,避免再次访问数据库。

         3.使用布隆过滤器:使用布隆过滤器对请求进行预处理,过滤掉可能不存在的数据。布隆过滤器通过哈希函数将元素映射到位数组上,可以快速判断一个元素是否可能存在于集合中。如果请求被布隆过滤器拦截,则可以直接返回结果,而无需查询数据库。但是,布隆过滤器存在误判的情况,即可能将不存在的元素判断为存在。(布隆过滤器我的另一篇博客有详细介绍)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 21-原理图的可读性的优化处理
  • 【DataKit系列】数据迁移-实例搭建步骤(二)
  • 使用GCC编译Notepad++的插件
  • 【Python数据处理】MatplotlibNumpyPandas常用API整理
  • MySQL学习(19):锁
  • CSS文本两端对齐
  • StringJoiner更优雅创建含分隔符的字符序列
  • k8s数据卷(volume)管理
  • 深度学习 - 数据存储形式对比(pkl/CSV/JSON等)
  • 设计模式的概念
  • qt-声明、宏
  • 【深度学习】【语音】TTS,Matcha-TTS,测试效果,训练中文,chinese
  • YOLOv8添加MobileViTv3模块(代码+free)
  • 指针基础知识(笔记)
  • 用uniapp 及socket.io做一个简单聊天app 踢人拉黑 7
  • ----------
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • GraphQL学习过程应该是这样的
  • mysql中InnoDB引擎中页的概念
  • OSS Web直传 (文件图片)
  • overflow: hidden IE7无效
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpringBoot几种定时任务的实现方式
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Theano - 导数
  • web标准化(下)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享一份非常强势的Android面试题
  • 构建工具 - 收藏集 - 掘金
  • 什么软件可以剪辑音乐?
  • 算法-插入排序
  • 为视图添加丝滑的水波纹
  • 问题之ssh中Host key verification failed的解决
  • 我看到的前端
  • 一个完整Java Web项目背后的密码
  •  一套莫尔斯电报听写、翻译系统
  • 原生Ajax
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #Linux(Source Insight安装及工程建立)
  • $L^p$ 调和函数恒为零
  • (52)只出现一次的数字III
  • (c语言)strcpy函数用法
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...