说透缓存击穿、穿透、雪崩及常用解决方案

news2024/11/16 19:06:17

文章目录

  • 缓存击穿、穿透、雪崩及解决方案
    • 击穿、穿透、雪崩的意思
    • 缓存击穿
    • 缓存穿透
    • 缓存雪崩
    • 总结
  • 系列文章目录


本文是系列文章,为了增强您的阅读体验,已将系列文章目录放入文章末尾。👍👍👍

缓存击穿、穿透、雪崩及解决方案

Redis是一种高性能的键值型数据库,它可以用来实现缓存功能,提高应用的响应速度和承载能力。但是,使用Redis缓存也会遇到一些常见的问题,比如缓存击穿、缓存穿透、缓存雪崩。这些问题都会影响缓存的效率和稳定性,所以需要了解它们的原因和解决方案,保障Redis能够正常运行。

击穿、穿透、雪崩的意思

击穿、穿透、雪崩这三个词语很容易混淆,本文先对词语进行理解,再讲解技术

击穿:击穿拆开后,是击和穿。击意为敲打,或做类似敲打的动作穿意为穿透

击是什么?如下图,攻击的意思

请添加图片描述

穿是什么?如下图,穿透,造成的效果就是个

请添加图片描述

雪崩的意思很简单,就是一个字,如下图

请添加图片描述

白话讲解一下,击穿就是先击后穿;穿透就是穿透,有个洞;雪崩就是多,很多很多

再从技术角度说明击穿、穿透、雪崩

请添加图片描述

击穿意为先击后穿。热点数据存在,且能够击中。但是由于热点数据失效从而访问数据库

穿透意为直接穿。由于访问不存在的数据,从而直接访问数据库

雪崩意为多,大量。大量缓存同时失效,从而直接访问数据库

缓存击穿

缓存击穿的定义:某个热点数据在缓存中过期或失效时,大量的请求同时访问该数据,导致数据库压力过大甚至崩溃的现象。通常会发生在数据更新频率较高或者缓存设置了相同的过期时间的时候。

实际上可以这么理解:应该有的数据但是没读到,从而击穿了缓存,直接访问数据库

可采取的方案:

  • 不设置过期时间或设置较长的过期时间:这样可以避免热点数据同时失效,但是也会增加内存占用和数据不一致的风险
  • 定时更新。比如这个热点数据的过期时间是 2 小时,那么每到 1小时50 分钟时,通过定时任务去更新这个热点 key,并重新设置其过期时间
  • 互斥锁:当缓存中没有数据时,只允许一个线程去数据库查询并更新缓存,其他线程等待该线程完成后再从缓存中获取数据。这样可以减少对数据库的并发访问,但是也会降低系统的吞吐量和响应速度
  • 分布式锁:当多个Redis节点存在时,可以使用分布式锁来保证只有一个节点去数据库查询并更新缓存,其他节点等待该节点完成后再从缓存中获取数据。这样可以避免多个Redis节点同时访问数据库,但是也会增加系统的复杂度和延迟

缓存穿透

缓存穿透的定义:

用户查询一个不存在的数据,导致缓存中没有该数据,每次都要去数据库查询,而数据库中也没有该数据,造成无效的查询和资源浪费的现象。通常会发生在用户恶意攻击或者参数校验不严格的时候

实际上可以这么理解:不应该有的数据非要读,从而穿透了缓存,直接访问数据库

可采取的方案:

  • 业务层校验。用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。比如请求参数为主键自增 id ,那么对于请求小于 0 的 id 参数, 明显不符合业务逻辑。
  • 缓存空值:当数据库中没有查询到数据时,仍然将空值或者默认值写入缓存,并设置一个较短的过期时间。这样可以减少对数据库的访问次数,但也会占用一定的内存
  • 使用布隆过滤器:布隆过滤器是一种概率型的数据结构,它可以判断一个元素是否可能存在于一个集合中。可以将所有可能存在的数据的键值哈希到一个足够大的位图中,当用户查询一个数据时,先用布隆过滤器判断该键值是否可能存在,如果不存在则直接返回,如果存在则再去缓存和数据库中查询。这样可以有效地拦截不存在的数据请求,但是也会有一定的误判率和内存开销

缓存雪崩

缓存雪崩的定义:在某个时间点,大量的缓存数据同时失效或者缓存服务器宕机,导致所有的请求都要去数据库查询,造成数据库压力过大甚至崩溃的现象。这种情况通常发生在缓存设置了相同或者相近的过期时间或者缓存服务器遭遇意外故障的场景下。

实际上可以这么理解:大量数据读取,从而使缓存雪崩,直接访问数据库

为了防止缓存雪崩,可以采用以下几种方法:

  • 设置不同的过期时间。可以给缓存设置不同或者随机的过期时间,避免大量的缓存同时失效,造成数据库压力突增
  • 缓存预热:对于即将来临的大量请求,可以将数据提前缓存在Redis中,并设置不同的过期时间
  • 使用多级缓存:可以构建多级缓存架构,比如Nginx缓存+Redis缓存+本地缓存等,当某一级缓存出现问题时,可以从其他级别的缓存中获取数据,增加系统的容错能力
  • 使用限流熔断:可以利用一些限流和熔断组件,对请求进行限流和降级处理,当请求超过系统能承受的阀值时,直接拒绝或者返回默认值,保护数据库不被打垮
  • 使用集群和负载均衡:可以将Redis部署成集群模式,并使用负载均衡组件,比如LVS、HAProxy等,对请求进行分发和转发,提高Redis的可用性和并发能力

总结

本文介绍了缓存击穿、缓存穿透和缓存雪崩三种问题及解决方案。通过本文,可以了解到:

  • 缓存击穿:先击后穿
  • 缓存击穿的解决方案有:设置热点数据永不过期、定时更新、分布式
  • 缓存穿透:将缓存穿了个洞
  • 缓存穿透的解决方案有:业务层校验、缓存空值、布隆过滤器
  • 缓存雪崩:大量失效Key
  • 缓存雪崩的解决方案有:设置不同的过期时间、缓存预热、多级缓存、限流熔断、集群和负载均衡

系列文章目录

Redis内存优化——String类型介绍及底层原理详解
Redis内存优化——Hash类型介绍及底层原理详解
Redis内存优化——List类型介绍及底层原理详解
Redis内存优化——Set类型介绍及底层原理详解
Redis内存优化——ZSet类型介绍及底层原理详解
Redis内存优化——Stream类型介绍及底层原理详解
Redis内存优化——Hyperloglog、GEO、Bitmap、Bitfield类型详解
Redis的三种持久化策略及选取建议
缓存更新的四种策略及选取建议
内存淘汰及回收机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的内网渗透-metasploit基础

目录 MSF postgresql msf模块 永恒之蓝 木马下放 后渗透一些简单命令 MSF Msfconsole是Metasploit框架的主要控制台界面。 开源的渗透软件 postgresql 使用的是postgresql数据库(metasploit所依载的数据库,没有他也可以运行metasploit框架&…

Vue中如何进行二维码生成与扫描?

Vue中如何进行二维码生成与扫描? 二维码是一种广泛应用于各种场合的编码方式,它可以将信息编码成一张二维图案,方便快捷地传递信息。在Vue.js中,我们可以使用一些库和组件来实现二维码的生成和扫描。本文将介绍如何在Vue中实现二…

高频RFID工业读写器在自动化产线上如何应用?

工业读写器在自动化生产上具有十分重要的作用,它可以对工业生产中的贴上RFID标签的各种零部件和产品,进行跟踪与识别。利用RFID技术进行非接触的物体识别和追踪,更好的掌握产线上的物料信息。 高频RFID工业读写器在自动化产线上如何应用&…

Android studio C++调试问题汇总

问题1:如下图所示,cpp目录不显示或cpp目录不显示C源文件。 此问题由由于abiFilter指定为armeabi,但armeabi架构已经不再支持的原因导致,将armeabi修改为armeabi-v7a或arm64等其他支持的架构即可,修改后如下图所示&…

致敬易语言,Excel衍生新型中文编程,Python用户:转折点到了

没有逃过被命运的捉弄 易语言作为中文编程里的老大,刚开始的时候,叫E语言。 创始人吴涛,地道的中国人,就是为了让中国人不再孜孜不倦的去追难懂的编程语言,降低开发门槛。 易语言的结局最终也没逃过被命运的捉弄&…

一款可以拿来做毕设的图书管理系统,简单易掌握,非常nice

项目介绍 项目简介 使用jsp、layui、mysql完成的图书馆系统,包含用户图书借阅、图书管理员、系统管理员界面,功能齐全。 项目详细介绍 本图书管理系统总体上分为前台页面显示和后台管理。 共包含三个大模块:用户、图书管理员、系统管理员…

全量程真空压力综合测量系统的高精度控制解决方案

摘要:针对工作范围在5~1.3Pa,控制精度在0.1%~0.5%读数的全量程真空压力综合测量系统技术要求,本文提出了稳压室真空压力精密控制的技术方案。为保证控制精度,基于动态平衡法,技术方案在高真空、低真空和正压三个区间内…

初识s3c2440A之ARM体系架构入门linux硬件

文章目录 前言一、环境平台的基本介绍二、ARM体系架构必备知识1. 计算机三大组成2. ARM的分类2.1 ARM Cortex-A系列2.2 ARM Cortex-R系列2.3 ARM Cortex-M系列 3. 2440ARM的系统架构 总结 前言 如果大家在前期学习了c语言,并且具备了一定的c语言功底,且学…

7 原子类

Java.util.concurrent.atomic 7.2 没有CAS之前 多线程环境中不使用原子类保证线程安全i(基本数据类型) class Test {private volatile int count 0;//若要线程安全执行执行count,需要加锁public synchronized void increment() {count;}pu…

二叉树前序遍历:在树叶掉落前,寻找根的方向

本篇博客会讲解力扣“144. 二叉树的前序遍历”的解题思路,这是题目链接。 先来审题: 由于本篇博客会使用C语言来实现这道题,最简单的解法自然是使用递归。所谓前序遍历,即按照“根、左子树、右子树”的顺序来遍历,当…

【新版】系统架构设计师 - 数据库系统

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 数据库系统考点摘要数据库系统模式数据库视图数据模型(基本数据模型)数据库完整性约束关系模型关系代数规范化理论候选键、主键、外键、主属性,非主属性求候选键…

【笔记】最优解人生

死前归零 如果在死亡之前没有将赚到的钱花完,那么剩下那些没花完的钱,就是你白白浪费的生命能量。 60岁以后,虽然医疗开支变大,但娱乐,衣物的开始会变小,总体上开销会越来越少。 如何“死前归零”呢&…

两两交换链表中的节点

题目描述 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next…

【备战秋招】每日一题:4月15日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

简单实用折叠面板可以折叠收起展开内容区域

前端简单实用折叠面板可以折叠收起展开内容区域, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id12860 效果图如下: 代码如下: # 简单实用折叠面板可以折叠收起展开内容区域。 #### 使用方法 使用方法 <!-- leftText:做标题 rigText:…

智能算法终极大比拼,以CEC2005测试函数为例,十种智能算法直接打包带走,不含任何套路!

包含人工蜂群(ABC)、灰狼(GWO)、差分进化(DE)、粒子群(PSO)、麻雀优化(SSA)、蜣螂优化(DBO)、白鲸优化(BWO)、遗传算法(GA)、粒子群算法(PSO)&#xff0c;基于反向动态学习的差分进化算法&#xff0c;共十种算法&#xff0c;直接一文全部搞定&#xff01; 由于上一篇代码&…

赋能矿山 | KaiwuDB 智慧矿山解决方案

行业背景 随着勘探和矿产开发技术的提高以及能源需求量的大幅增加&#xff0c;矿山开发速度持续加快。随之而来的诸多弊端&#xff0c;如矿山资源综合利用率低、管理方式粗放、安全和环境污染等问题日益突出&#xff0c;使得矿业智能化建设迫在眉睫。 近年来&#xff0c;政府…

【算法与数据结构】160、LeetCode相交链表

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题题目蛮长的。说的大概意思就是对比指针地址&#xff0c;只要相等了&#xff0c;那就是相交节点。…

华为OD机试之执行时长(Java源码)

执行时长 题目描述 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务&#xff0c;一次执行耗时1秒&#xff0c;在保证GPU不空…

论文解读 | 机器人路径跟踪的受控纯追踪法

原创 | 文 BFT机器人 01 摘要 这篇文章是关于机器人路径跟踪的受控纯追踪算法的研究。文章介绍了传统的纯追踪算法以及相关变体&#xff0c;并提出了受控纯追踪算法作为本文的主要贡献。该算法旨在适应实际环境中的服务和工业移动机器人&#xff0c;提供方法来调整机器人的平移…