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

【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透

1、概念

缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失败。但是当我们的用户增多或者用户源源不断的发起请求,redis中也没有命中,全去访问了持久层数据库,这就会导致数据库造成很大的压力,这时候就相当于出现了缓存穿透。

be1d996bf094498297036d816e2bbf29.png如图所示:Client发送请求,若Redis中没有,就把所有请求转向MySQL数据库,当请求增多,MySQL压力增大,就会出现缓存穿透现象。

2、解决方法

①:布隆过滤器(BloomFilter)

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,先在控制台进行校验,不符合则丢弃,从而避免对底层数据库的压力。

ca8892e5705e46129f532edce7301857.png

布隆过滤器作用是判断数据是否存在集合之中,正好和Redis这个缓存的场景相同,如图所示,当我们的数据到Redis之前先在BloomFilter检验,如果数据不符合规范,就丢弃,减少对数据库的压力。

②:缓存空对象

当存储层不被命中后,即使返回一个空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据会从缓存中取,保护了后端的数据源。

06b9fa063484476a873f67405b8e4032.png

缺点:

a.如果空值被缓存起来,则缓存需要更多的空间存储更多的键(会有更多空的键);

b.即使设置了过期的时间,还是会在缓存层和存储层的数据会有一段时间窗口不一致,这对需要保持一致性的业务会有影响。

二、缓存击穿

1、概念

缓存击穿(查询的量太大),是指一个key非常热点,在不断的扛着大并发,大并发集中的对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿透了缓存,直接请求数据库,由于是热点数据,数据量很大,在缓存过期的同时,大量数据访问我们数据库,并且回写到缓存,会导致数据库瞬间压力过大。

2、解决方法

①:设置热点数据永不过期

从缓存的层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。

②:加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有收获分布式锁的权限,因此只需要等到即可。这种方式将高并发的压力转移到了分布式锁上,因此对分布式锁的考验很大。如下图所示:

f4f282944a47455a98c0a8a0361fe3a1.png三、缓存雪崩

1、概念

缓存雪崩,是指在某一个时间段,缓存集中过期失效,redis宕机了。

如下图所示:

868823b8a7ad48bc97730784136baaef.png

2、解决方法

①:Redis的高可用

既然redis可能挂掉,那我们就可以多设置几台redis,搭建一个集群,这样一来一台机器挂掉后其他的还可以继续工作。

②:限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询寻数据和写缓存,其他线程等待。

③:数据预热

数据加热的含义就是正式部署之前,我们把可能的数据预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发前动手加载缓存中不同的key,设置不同的过期时间,让缓存的时间点尽量均匀。

四、总结

      这部分的内容是对b站up主【狂神说Java】内容的总结,这里只是讲解了大概的原理,让大伙知道有这些情况,那后期呢,博主会再出一期详细的博客,讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助,不要忘记,点赞👍,支持博主一波哦!

 

相关文章:

  • 可变形注意力(Deformable Attention)及其拓展
  • 【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解
  • this的指向问题总结
  • 【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分]
  • 常见锁策略,CAS,synchrodized原理讲解
  • 企业微信机器人的运营策略与实践
  • LeetCode 热题 100 | 二叉树(终)
  • 基于springboot+vue的中小型医院网站(前后端分离)
  • 零基础到高级:Android音视频开发技能路径规划
  • 数智赋能,变革加速:人工智能技术与低代码开发利器
  • 利用Ubuntu22.04启动U盘对电脑磁盘进行格式化
  • 人工智能|机器学习——基于机器学习的舌苔检测
  • Rust 安装
  • mysql在服务器中的主从复制Linux下
  • 基于Redis商品库存扣减方案
  • 【Linux系统编程】快速查找errno错误码信息
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java反射-动态类加载和重新加载
  • mysql中InnoDB引擎中页的概念
  • php ci框架整合银盛支付
  • python docx文档转html页面
  • spring学习第二天
  • tab.js分享及浏览器兼容性问题汇总
  • vue中实现单选
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 如何胜任知名企业的商业数据分析师?
  • 跳前端坑前,先看看这个!!
  • 因为阿里,他们成了“杭漂”
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #《AI中文版》V3 第 1 章 概述
  • #laravel 通过手动安装依赖PHPExcel#
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.each()与$(selector).each()
  • (¥1011)-(一千零一拾一元整)输出
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (八)Flask之app.route装饰器函数的参数
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)模仿学习-完成后台管理页面查询
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Family_物联网
  • .net core Swagger 过滤部分Api
  • .Net Core 中间件验签
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 反射 Reflect
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET学习教程二——.net基础定义+VS常用设置
  • :not(:first-child)和:not(:last-child)的用法