当前位置: 首页 > 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】内容的总结,这里只是讲解了大概的原理,让大伙知道有这些情况,那后期呢,博主会再出一期详细的博客,讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助,不要忘记,点赞👍,支持博主一波哦!

 

http://www.lryc.cn/news/307603.html

相关文章:

  • Rocky Linux安装部署Elasticsearch(ELK日志服务器)
  • Linux浅学笔记04
  • 【Day59】代码随想录之动态规划_647回文子串_516最长回文子序列
  • ECLIP
  • STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例
  • 使用Postman和JMeter进行signature签名
  • uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题
  • IPD(集成产品开发)—核心思想
  • uniapp android 原生插件开发-测试流程
  • MyCAT从入门到实战(配置文件介绍)
  • 【LeetCode-300】最长递增子序列(动归)
  • Mysterious-GIF-攻防世界-MISC
  • 【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)
  • 【Go语言】Go语言中的切片
  • Qt程序设计-钟表自定义控件实例
  • Redis的发布订阅功能教程,实现实时消息和key过期事件通知功能
  • 4核8g服务器能支持多少人访问?
  • 【Android】切换系统全局语言设置
  • 【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II
  • AxureCloud配置文件详细介绍
  • Centos开机网卡自启动失败
  • 华为OD技术面试案例3-2024年
  • 全面升级!Apache HugeGraph 1.2.0版本发布
  • WinCC如何与三菱Q系列PLC进行以太网通讯
  • Spring11、整合Mybatis
  • C语言练习:(力扣645)错误的集合
  • 广和通发布基于MediaTek T300平台的RedCap模组FM330系列及解决方案
  • 代码随想录训练营第六十三天打卡|503.下一个更大元素II 42. 接雨水
  • 【web】nginx+php环境搭建-关键点(简版)
  • 1、什么是ETF?