Redis缓存预热、缓存雪崩、缓存击穿、缓存穿透

文章目录

    • Redis缓存预热、缓存雪崩、缓存击穿、缓存穿透
      • 一、缓存预热
        • 1、问题排查
        • 2、解决方案
          • (1)准备工作
          • (2)实施
          • (3)总结
      • 二、缓存雪崩
        • 1、解决方案
      • 三、缓存击穿
        • 1、解决方案
          • (1)互斥锁
          • (2)逻辑过期方案
        • 3、方案对比
      • 四、缓存穿透
        • 1、解决方案
          • (1)缓存空对象
          • (2)布隆过滤

Redis缓存预热、缓存雪崩、缓存击穿、缓存穿透

一、缓存预热

即宕机,服务器启动后迅速宕机

1、问题排查

  1. 请求数量较高
  2. 主从之间数据吞吐量较大,数据同步操作频繁较高,因为刚启动,缓存没有任何数据

2、解决方案

(1)准备工作
  1. 日常例行统计数据访问记录,统计访问频率比较高的热点数据
  2. 将将统计结果中的数据分离,根据级别,redis 优先加载级别较高的热点数据
(2)实施
  1. 使用脚本程序固定触发数据预热过程
  2. 如果条件允许,使用了CDN(内容分发网络),效果会更好

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度

(3)总结

缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据

二、缓存雪崩

缓存雪崩是指在同一时段大量的缓存 key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力

1、解决方案

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

三、缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

1、解决方案

  • 互斥锁
  • 逻辑过期

逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大

在这里插入图片描述

(1)互斥锁

因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压力过大,但这也会影响查询的性能,因为此时会让查询的性能从并行变成了串行,我们可以采用tryLock方法 + double check来解决这样的问题。

假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。

在这里插入图片描述

(2)逻辑过期方案

**方案分析:**我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们内存了吗,我们可以采用逻辑过期方案。我们把过期时间设置在 redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个 线程去进行 以前的重构数据的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能走返回正确的数据。

这种方案巧妙在于,异步的构建缓存,缺点在于在构建完缓存之前,返回的都是脏数据。

在这里插入图片描述

3、方案对比

**互斥锁方案:**由于保证了互斥性,所以数据一致,且实现简单,因为仅仅只需要加一把锁而已,也没其他的事情需要操心,所以没有额外的内存消耗,缺点在于有锁就有死锁问题的发生,且只能串行执行性能肯定受到影响

逻辑过期方案: 线程读取过程中不需要等待,性能好,有一个额外的线程持有锁去进行重构数据,但是在重构数据完成前,其他的线程只能返回之前的数据,且实现起来麻烦

解决方案优点缺点
互斥锁没有额外的内存消耗,保证一致性,实现简单线程需要等待,性能受到影响,可能有死锁风险
逻辑过期线程无需等待,性能较好不能保证一致性,有额外内存消耗,实现复杂

四、缓存穿透

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库

1、解决方案

(1)缓存空对象
  • 优点:实现简单,维护方便
  • 缺点
    • 额外的内存消耗
    • 可能造成短期的不一致
(2)布隆过滤
  • 优点:内存占用较少,没有多余key
  • 缺点
    • 实现复杂
    • 存在误判可能

**缓存空对象思路分析:**当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了

**布隆过滤:**布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)

大家好呀,从昨天发布赛题一直到现在,总算完成了全国大学生数学建模竞赛B题完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 说实话团队通宵一直到现在做…

Matlab 如何选择采样频率和信号长度

Matlab 如何选择采样频率和信号长度 1、概述 在实际信号分析中经常会遇到要分辨出频率间隔为 的两个分量,在这种情形中如何选择采样频率和信号的长度呢? 2、案例分析 设有一个信号由三个正弦信号组成,其频率分别为 ,即&#xf…

合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)

图片 (Image) 图片IMG是用于显示图像的基本对象类型,图像来源可以是文件,或者定义的符号。 示例代码 -- 创建图片控件 img lvgl.img_create(lvgl.scr_act(), nil) -- 设置图片显示的图像 lvgl.img_set_src(img, "/lua/luatos.png") -- 图片…

2023国赛数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

中科驭数携DPU系列创新产品亮相2023服贸会

9月2日至6日,由商务部、北京市政府主办的2023年中国国际服务贸易交易会(简称“服贸会”)在北京举行。在电信、计算机和信息服务专题展馆,中科驭数等一批国家专精特新“小巨人”携最新数据处理器DPU亮相,展示了多项创新…

【LeetCode75】第五十题 无限集中的最小数字

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 这是我们在LeetCode75里遇到的第二道设计类题目,难度比上一次的设计题目要难上一些。 题目假设我们拥有一个从1开始的无限集…

跨境电商产业链,服务商的“霸道”你见识过吗?(测评补单)

跨境电商行业的服务商众多,涉及到从前期培训和店铺注册准备到中期选品软件、营销服务、流量投放和支付等多个环节。然而,行业乱象也日益严重,出现了一些不良现象,如恶意竞争、高价要求、割韭菜等。 卖家在选择服务商时应谨慎&…

Matlab图像处理-最大类间方差阈值选择法(Otsu)

基本思想 最大类间方差阈值选择法又称为Otsu 算法,该算法是在灰度直方图的基础上用最小二乘法原理推导出来的,具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分,使两部分之间的方差取得最大值&#x…

win10/11安裝時 OOBE強制跳過登入Microsoft賬戶

Windows11官方正式版ISO,目前版本号为22621.963,微软维持每个月发布一次ISO的节奏。每周还会有一些补丁在线推送,目前更新到了22621.1105。同时,还有Beta和Dev通道推送预览版。Dev通道的更为激进还不稳定,目前版本号为…

安装SAPGUI 8.0

SAP_GUI_for_Windows_8.00_Comp.64\PRES1\GUI\Windows\Win64

苹果计划2024年AirPods引入新接口,后续升级体温测量、听力测试

据彭博社马克・古尔曼(Mark Gurman)报道,苹果公司计划在最早2024年为其旗舰无线耳机AirPods和AirPods Max引入USB-C端口,并试图将其所有基于Lightning接口的配件改用USB-C接口。 据古尔曼表示,AirPods Pro将率先改用新…

Docker部署Springboot项目

Docker部署Springboot项目 在学习的若依的过程中,想尝试学习使用Docker实现SpringBoot项目的部署,于是实践如下: 项目打包完成后,放到服务器的目录结构如下: cd / mkdir ruoyidockerfile文件内容 笔者这里是配置读取…

微信小程序的开发---tabBar的介绍

目录 一、tabBar的介绍 二、tabBar的6个组成部分 三、tabBar节点的配置项 四、tab项的配置选项 五、tabBar的使用 一、tabBar的介绍 tabBar是移动端应用常见的页面效果,用于实现多页面的快速切换。小程序中通常将其分为: (1)…

企业架构LNMP学习笔记3

服务器基本环境配置: 1、安装虚拟机,centos7.9 操作系统; 2、网络配置; 3、机器名FQDN设置; 4、DNS解析设置,本地hosts设置; 5、配置yum源环境; 6、vim安装配置; …

大麦订单生成 大麦订单购票成功截图生成

后台一键生成链接,后台管理 教程:解压源码,修改数据库config/Congig 不会可以看源码里有教程 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

容器编排学习(一)k8s集群管理

一 Kubernetes 1 概述 就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的一一编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统&#xff0…

球谐函数实现环境光照漫反射实践

该文章以及代码主要来自 图形学论文解析与复现:【论文复现】An Efficient Representation for Irradiance Environment Maps 作者:Monica的小甜甜 与原文的不同: 对一些有问题的地方进行了修改添加了注释对有疑问的地方添加了疑问点引入了其…

【广州华锐互动】煤矿设备AR远程巡检系统实现对井下作业的远程监控和管理

煤矿井下作业环境复杂,安全隐患较多。传统的巡检方式存在诸多弊端,如巡检人员难以全面了解井下情况,巡检效率低下,安全隐患难以及时发现和整改等。为了解决这些问题,提高煤矿安全生产水平,越来越多的企业开…

win10系统配置vmware网络NAT模式

1,查看win10 IP地址:ipconfig 2, vmware设置:编辑>>虚拟网络编辑器>>点击添加网络(选择NAT模式) 3,虚拟机网络设置:点击VMware虚拟机>>设置>>网络适配器 4&#xff…

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】-未完成

linux配环境心得:conda/本地配cuda,cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一,服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…