并发场景下 缓存击穿 穿透 雪崩如何解决

news/2024/5/24 12:22:37/ 标签: 缓存

最近建了一个技术交流群,欢迎志同道合的同学加入,群里主要讨论:分享业务解决方案、深度分析面试题并解答工作中遇到的问题,同时也能为我提供写作的素材。

群号 208236931,欢迎进群交流学习,一起进步、进步、进步!

前言

在实际的工作中,redis作为缓存使用,降低DB的压力,应用比较广泛。老生常谈的话题,什么是缓存击穿、缓存穿透、缓存雪崩,遇到了应该怎么去解决?

我想说的是,大部分人其实都不会遇到这个问题,为什么呢?不管你做C端,还是B端,流量不到一定程度,根本不会遇到。你想想是不是,或者你真遇到过吗?我目前为止,也就遇到过,缓存穿透,那还是有人恶心访问导致的。

但是这些概念,以及解决的方案,还是需要去了解下,为什么呢?面试的时候,90%的会被问。最主要是深入了解下,提升自己。假设哪天泼天富贵的流量砸到你身上,起码地主家有存粮,心里不慌,轻松拿捏。

下面我们一起了解下,什么是缓存穿透、缓存雪崩、缓存穿透,出现的原因,以及解决方案。

缓存穿透

当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存中数据不存在,再去访问数据库,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。

产生的原因

  • 查询不存在的数据:当查询一个不存在于缓存中的数据时,缓存无法命中,请求会直接访问数据库。
  • 恶意请求:恶意请求会通过各种方式绕过缓存,直接访问数据库。

解决方案

  • 布隆过滤器(Bloom Filter):使用布隆过滤器可以在缓存层面过滤掉一些无效的请求,从而避免无效请求直接访问数据库。
    • 布隆过滤器是一种高效的数据结构,可以快速判断某个元素是否存在于一个集合中。通过在缓存层面使用布隆过滤器,可以在查询前快速判断数据是否存在,如果不存在可以直接返回结果,避免对数据库的查询操作。
  • 缓存空值处理:当查询的数据在数据库中确实不存在时,可以将空值也缓存起来,设置一个较短的过期时间。这样,下次查询同样的数据时,就可以从缓存中获取到空值,避免再次访问数据库。

缓存雪崩

缓存雪崩指的是在某个时间点,缓存中的大部分或全部数据同时失效,导致大量的请求直接落到数据库上,从而引发数据库的压力过大,甚至崩溃。这种情况通常发生在缓存中的数据在同一时间段内过期,或者由于某种原因导致缓存失效。

产生的原因

  • 缓存过期时间设置不合理:如果大量的缓存在同一时间段内过期,就会导致大量请求直接访问数据库。
  • 缓存服务器故障:当缓存服务器发生故障,无法提供服务时,所有的请求都会直接访问数据库。
  • 热点数据集中:如果某些热门数据的缓存失效时间相近,可能会导致大量请求同时访问数据库。

解决方案

  • 设置合理的缓存过期时间:合理设置缓存的过期时间,避免大量缓存同时失效。
  • 分散缓存失效时间:将热门数据的缓存失效时间分散开,避免集中在同一时间段失效,失效时间:固定的时间+一个随机值
  • 实现缓存高可用:通过使用缓存集群和备份服务器等机制,提高缓存的可用性,减少单点故障的风险。

缓存击穿

缓存击穿指的是一个热点数据的缓存失效,导致大量请求直接落到数据库上,造成数据库压力过大,影响系统性能。与缓存雪崩不同,缓存击穿指的是某个特定的数据失效,而不是全部数据。

产生的原因

  • 热点数据缓存失效:当某个热点数据的缓存失效时,大量请求同时访问数据库。
  • 高并发请求:在高并发的情况下,大量请求同时访问数据库,容易造成缓存击穿。

解决方案

  • 如果是热点数据,那么可以考虑设置永远不过期。
  • 互斥锁(Mutex):在缓存失效的时候,可以使用互斥锁来控制只有一个请求可以访问数据库,其他请求需要等待。当名列前茅个请求重新生成缓存后,其他请求可以从缓存中获取数据,避免对数据库的重复访问。
  • 预加载(Cache Preloading):在缓存失效前,通过定时任务或者后台线程提前加载热点数据到缓存中,避免热点数据缓存失效时的突然访问峰值。
  • 分布式锁(Distributed Lock):使用分布式锁的机制,确保只有一个线程或者进程可以进行缓存重建操作。其他线程或者进程在获取锁之前需要等待,避免重复重建缓存
  • 降级策略(Fallback Strategy):在缓存失效的情况下,可以提供一个备用方案,例如直接返回默认值或者从数据库中获取数据。这样可以保证系统的稳定性,避免由于缓存击穿导致的系统崩溃。

缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候,先查询数据库,然后再将数据回写到缓存

如果不进行预热, 那么 Redis 初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中, 对数据库造成流量的压力。

缓存预热的操作方法

  • 数据量不大的时候,工程启动的时候进行加载缓存动作;
  • 数据量大的时候,设置一个定时任务脚本,进行缓存的刷新;
  • 数据量太大的时候,优先保证热点数据进行提前加载到缓存

场景

这种场景,非常多的,比如:

  • 抢购
  • 秒杀
  • 新系统上线
  • 公告
  • 热点新闻

http://www.ppmy.cn/news/1424466.html

相关文章

泛型的初步认识(1)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

【Linux】地址空间虚拟地址

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 虚拟地址1.1 虚拟地址引入1.2 虚拟地址理解1.3 虚拟地址细节问题 2. 地址空间2.1 理解地址空间2.2 页表和写时拷贝 3. 进程调度 1. 虚拟地址 1.1 虚拟地址引入 先先来一个测试代码&#xff1a; 1 #include<st…

深入探讨虚拟现实中的新型安全威胁:“盗梦攻击”及其防御策略

随着虚拟现实&#xff08;VR&#xff09;技术的飞速发展&#xff0c;用户体验达到了前所未有的沉浸水平&#xff0c;但也暴露在一系列新的安全威胁之下。本文着重介绍了近期出现的一种高度隐秘且影响深远的攻击手段——“盗梦攻击”。这一概念由芝加哥大学的研究人员提出&#…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

C++反向迭代器的封装和模板进阶(个人笔记)

C反迭代器和模板进阶 1.反向迭代器2.模板2.1非类型模板参数2.2模板的特化2.2.1函数模板2.2.2类模板特化2.2.2.1 全特化2.2.2.1 偏特化 2.3模板的分离编译2.4模板的优缺点 1.反向迭代器 用正向迭代器适配出反向迭代器 这里是自己实现的反向迭代器版本&#xff0c;与STL标准库里…

监督算法建模前数据质量检查

一、定义缺失值检测函数 def missing_values_table(df):# 总的缺失值mis_val df.isnull().sum()# 缺失值占比mis_val_percent 100 * df.isnull().sum() / len(df)# 将上述值合并成表mis_val_table pd.concat([mis_val, mis_val_percent], axis1)# 重命名列名mis_val_table_…

数据结构—顺序表实现通讯录

在上一节我们基本了解了顺序表的基本知识&#xff0c;接下来我们就用顺序表来实现一下通讯录。 一、基于动态顺序表实现通讯录 1.1 功能介绍 1. 能够保存用户信息&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;地址等 2. 添加联系人信息 3. …

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-C…

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测 目录 组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本…

【opencv】示例-videocapture_obsensor.cpp 读取和处理通过OBSENSOR摄像头获取的视频流数据...

/*** 注意: Astra2、Gemini2 和 Gemini2L 相机目前仅支持 Windows 以及 Linux 内核版本不高于4.15&#xff0c;更高版本的 Linux 内核可能会有异常。 */#include <opencv2/videoio.hpp> // 包含为视频捕捉提供的功能 #include <opencv2/highgui.hpp> // 包含高…

良心无广的4款软件,每一款都逆天好用,且用且珍惜

闲话少说&#xff0c;直上干货&#xff01; 清浊 清浊是一款异常强大的国产手机清理应用&#xff0c;其设计理念崇尚简洁&#xff0c;用户界面清晰明快&#xff0c;且无任何弹窗广告干扰。更难能可贵的是&#xff0c;这款应用提供全程免费服务&#xff0c;功能多样&#xff0…

python django mvc

MVC框架: 1、URL映射到方法 [rootzz mysite]# cat urls.py """mysite URL Configuration The urlpatterns list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function …

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…

轻量级Rust异步运行时

在Rust编程语言的世界中&#xff0c;异步编程是提高程序效率和性能的重要手段。现代软件开发中&#xff0c;随着并发编程需求的不断增加&#xff0c;异步运行时处理诸如I/O操作、网络通信等任务变得尤为重要。smol是Rust语言中的一个小巧而快速的异步运行时&#xff0c;尽管特性…

拼多多评论怎么删除?拼多多已评价不能删掉吗?

拼多多作为国内知名的电商平台&#xff0c;吸引了大量消费者的关注和参与。在购物过程中&#xff0c;我们经常会看到各种各样的评论&#xff0c;这些评论对于其他消费者来说&#xff0c;具有重要的参考价值。有时我们可能会因为各种原因需要删除自己的评论。那么&#xff0c;拼…

开发语言漫谈-JavaScript

JavaScript、Java名字很相近&#xff0c;但它们没有任何亲缘关系&#xff0c;是由不同公司开发的编程语言。Java由Sun公司&#xff08;后被Oracle收购&#xff09;开发&#xff0c;JavaScript最初是由Netscape公司开发的&#xff08;当年浏览器的霸主&#xff09;。JavaScrip…

Android Gradle 开发与应用 (七) : 实现打包自动复制文件插件

1. 前言 项目中遇到了一个问题 : 其中一个模块MyLibrary的assets文件夹中,需要存放很多文件(每个文件对应一个功能)。 这样导致的问题是MyLibrary打出的这个aar包体积特别大。 如果把MyLibrary严谨地拆解成若干个Module又比较费时,对于现在业务现状来说也显得没那么必要。…

Python项目2 数据可视化

生成数据 数据可视化 指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘 数据挖掘 紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表 示的小型数字列表&#xff0c;也可以是数以吉字节的数据。 漂亮地呈现数据关…

共享负载均衡后端的主机健康检查状态是异常的解决

场景&#xff1a;运维同事配置了后端主机&#xff0c;但是健康检查显示异常。其中有一台主机是正常的&#xff0c;权重为1。另外两台健康检查异常的权重为0。 curl 内网地址和端口是可以正常访问业务的&#xff0c;返回的状态码也是200。后端排查日志&#xff0c;可以发现正常…

免费GPT-3.5部署指南

OpenAI近期宣布&#xff0c;GPT-3.5现已支持无账号使用&#xff0c;这一变化无疑为全球AI爱好者带来了福音。然而&#xff0c;由于网络和地域限制&#xff0c;国内许多朋友仍然面临着使用上的挑战。 今天&#xff0c;我将向大家推荐两个开源项目&#xff0c;它们能够帮助您在国…