Redis-- 缓存预热+缓存雪崩+缓存击穿+缓存穿透

news/2024/10/20 20:38:59/

Redis-- 缓存预热+缓存雪崩+缓存击穿+缓存穿透**加粗样式**

  • 一 面试题引入
  • 二 缓存预热
  • 三 缓存雪崩
    • 3.1 问题现象
    • 3.2 预防+解决
  • 四 缓存穿透
    • 4.1 定义
    • 4.2 解决方案
      • 4.2.1 空对象缓存或者缺省值
      • 4.2.2 Google布隆过滤器Guava解决缓存穿透
  • 五 缓存击穿
    • 5.1 定义
    • 5.2 危害
    • 5.3 解决
  • 六 总结

一 面试题引入

  • 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过哪几种情况?
  • 缓存预热你是怎么做的?
  • 如何避免或者减少缓存雪崩?
  • 穿透和击穿有什么区别?他两是一个意思还是截然不同?
  • 穿透和击穿你有什么解决方案?如何避免?
  • 假如出现了缓存不一致,你有哪些修补方案?

二 缓存预热

@PostConstruct初始化白名单数据

三 缓存雪崩

3.1 问题现象

  • redis主机挂了,Redis全盘崩溃,偏硬件运维。
  • redis中有大量key同时过期大面积失效,偏软件开发

3.2 预防+解决

  • redis中key设置为永不过期or过期时间错开。
  • redis缓存集群实现高可用
    • 主从+哨兵。
    • Redis Cluster。
    • 开启redis持久化机制aof/rdb,尽快恢复缓存集群。
  • 多缓存结合预防雪崩:ehcache本地缓存+redis缓存
  • 服务降级:Hystrix或者阿里sentinel限流&降级

四 缓存穿透

4.1 定义

请求去查询一条记录,先查redis无,后查mysql无,都查询不到该条记录。但是请求每次都会达到数据库上面去。导致后台数据库压力暴增。这种现象我们称为缓存穿透,这个redis变成了一个摆设。

4.2 解决方案

在这里插入图片描述

4.2.1 空对象缓存或者缺省值

回写增强: 如果发生了缓存穿透,我们可以针对要查询的是,在Redis里存一个和业务部门商量后确定的缺省值(比如:零、负数、default、Null等。)比如,键uid:abcdXXX,值defaultNull作为案例的key和value。
先去redis查键uid:abcdxxx没有,再去mysql查没有获得,这就发生了一次穿透现象。
通过增强回写机制,mysql也查不到的话也让redis存入刚刚查不到的key并保护mysql。
但是此方法架不住黑客的恶意攻击,有缺陷...,只能解决key相同的情况。

黑客或者恶意攻击:
黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库区查询,可能会导致你的数据库由于压力过大而宕机。

  • key相同:第一次达到mysql,空对象缓存后第二次就返回defaultNull缺省值,避免mysql被攻击,不用再导数据库中去走一圈了。
  • key不同:由于存在空对象缓存和缓存回写,redis中的无关紧要的key也会越写越多(记得设置redis过期时间)。

4.2.2 Google布隆过滤器Guava解决缓存穿透

  • 让布隆过滤器作为白名单使用:白名单里面有的才让通过,没有直接返回。但是存在误判,由于误判率很小,1%达到mysql,可以接受。注意:所有key都需要往redis和bloomfilter里面放入。
  • 误判问题,但是概率小可以接受,不能从布隆过滤器删除元素
  • 全部合法的key都需要放入Guava版布隆过滤器+redis里面,不然数据就是返回null。
    在这里插入图片描述

五 缓存击穿

5.1 定义

大量的请求同时查询一个key时,此时这个key正好失效了,就会导致大量的请求都达到数据库上面去。
简单说就是热点key突然失效了,暴打mysql。
穿透和击穿,截然不同。

5.2 危害

  • 会造成某一时刻数据库请求量过大,压力剧增。
  • 一般技术部门需要知道热点key是那些个? 做到心里有数防止击穿。
    热点key失效原因:
  • 时间到了自然清除但还被访问到。
  • delete掉的key,刚巧又被访问。

5.3 解决

  • 差异失效时间,对于访问频繁的热点key,干脆就不设置过期时间。

    在这里插入图片描述在这里插入图片描述

  • 互斥更新,采用双检加锁策略

六 总结

在这里插入图片描述


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

相关文章

技术干货 | ​Navicat 面向 PostgreSQL 查询超时的工具解决方案

早前,我们发表过一篇《PostgreSQL 与 Navicat :数据库的中坚力量》 ,从产品的发展介绍了两者的渊源与共性,获得了许多童鞋的认可。而随着PostgreSQL 在国内热度愈发高涨,应用也愈发广泛。近期,我们收到许多…

2023-5-30第三十天

effort力气,精力,努力 affect影响,改变,感动 effect结果,效果,影响 worker ampersand &号 asterrisk *号 deal difficulty lose magic proprientary专卖的,所有权 property vow…

Zabbix“专家坐诊”第193期问答汇总

问题一 Q:大佬们,怎么才能将zabbix-server接收到的数据全部展示出来呢?目前我的显示数据无法全部显示。 A:这个是用zabbix_sender发送过来的?确认下数据中是否包含空格等,如果有空格使用反斜杠转义或者单…

关于Addressable打包图集与图片都打进去造成冗余

1)关于Addressable打包图集与图片都打进去造成冗余 ​2)Unity如何计算Root动画旋转 3)IL2CPP编译的Protobuf反射类运行时报空 4)为什么Active Constraints会出现过高的现象 这是第337篇UWA技术知识分享的推送,精选了UW…

客户拖尾款,怎么办?

俗话说,欠钱的是大爷,一点都没错。对于跨国催款,难度更大。 外贸订单关闭后,你最头疼的是什么?交货时间延迟了吗?还是交付后出现质量问题,客户要求索赔? 这两种常见的情况都不是我头…

AspNetCore中的依赖注入详解

1 概述 ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ASP.NET Core通过定义接口的方式对它们进行了“标准化”,我们将这些标准化的组件称为服务, …

SpringBatch的两种实现方式: Tasklet 和 Chunk

直接上代码 ■ 共通部分&#xff1a; 1. 代码结构 2. pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency> 3. framework/BatchAnnotation.java packa…

LTE网络的RSRQ、RSRP、SNR

内容来源openai: LTE网络对RSRQ的要求&#xff1a; LTE网络对RSRQ的要求是在正常情况下&#xff0c;RSRQ应该保持在-10dB到-20dB之间。如果RSRQ低于-20dB&#xff0c;信号质量会变得非常差&#xff0c;可能会导致数据传输速度变慢或者连接中断。如果RSRQ高于-10dB&#xff0c…