java面试题-Redis缓存穿透、雪崩、击穿

远离八股文,面试大白话,通俗且易懂

看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。

java面试题汇总-目录-持续更新中

这个问的挺多的,但是实际项目遇到的很少。网上看了一些标准答案,结合实际项目,做了下总结。

1、缓存穿透

含义:频繁的查询一个不存在于缓存中的数据,导致每次都是访问数据库。

场景:多存在于恶意攻击。正常业务肯定都是先查缓存,然后存在就直接返回,不存在就查询数据库。如果数据库中存在就保存在缓存里面,不存在直接返回null。但是此时有人恶意攻击,查询的全都是缓存里面不存在的,甚至数据库也不存在。那么每次就都会查询数据。

解决方案:

布隆过滤器:就是已存在的数据key提前存到这个过滤器里面。如果来请求了,就先看一下过滤器中是否有这个key,有的话执行后面的操作。没有就直接返回了。(这个不太好用,因为还需要考虑实时的更新这个过滤器中的值,但是面试我还是会提到。)

缓存空值:就是请求来了,缓存中没有,去查询数据库,数据库返回null。即使返回null了,我也把这个数据(key:空值)存在缓存里面。你下次来请求,这样就直接从缓存里面取空值给你。(但是这个要考虑一下清理操作,因为你存了空值,如果哪天业务里面真有了这个key,那么此时返回null就不合适了:两种方案:1是定时清理为空的key,2是创建数据的时候同时更新缓存)

**ip过滤:**这个是我做项目常用的,但不仅仅局限于缓存穿透,主要是防止恶意攻击。我在每个项目的过滤其中都加了IP过滤。具体就是:在项目的过滤器中,获取用户的请求ip,如果相同ip在指定时间段内请求次数大于我设定的次数,比如10秒 20次。就直接拉进黑名单。

2、缓存雪崩

含义: 缓存雪崩是指缓存中的大量数据同时失效,导致大量的请求直接访问数据库,增加了数据库的负载。-多个

**场景:**就是数据库中很多缓存都是设置了两小时失效,结果在俩小时突然到的时候,缓存都失效了,然后大量的请求直接去请求数据库。

解决方案:

错峰:给过期时间错开,本来两小时过期,可以改成1小时50分钟等等

加锁:单机环境互斥锁、分布式环境分布式锁。保证同一时间只有一个能线程能请求到。但是加锁需要注意加锁的粒度。因为加了锁对平时的查询也会有影响,所以范围尽可能小。不能得不偿失。

3、缓存击穿

含义: 缓存击穿是指对于某个热点数据的并发请求,在缓存失效的瞬间,大量请求直接访问数据库,导致数据库负载剧增。-单个

**场景:**这种在互联网行业比较常见,比如商城、购票、下单等等场景下。同时是高峰期的时候,比如双11期间,突然某个商品缓存没了。一大波请求直接到达,全都去请求数据库了。

解决方案:

对于这种高频的访问热点,就不要设置过期时间了!!如果非要设置那么就定时刷新缓存。

相关推荐
醉颜凉5 分钟前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
阿维的博客日记9 分钟前
java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
java·jvm
qiyi.sky10 分钟前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
lapiii35813 分钟前
图论-代码随想录刷题记录[JAVA]
java·数据结构·算法·图论
RainbowSea16 分钟前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring·spring cloud
程序员小明z17 分钟前
基于Java的药店管理系统
java·开发语言·spring boot·毕业设计·毕设
爱敲代码的小冰36 分钟前
spring boot 请求
java·spring boot·后端
Lyqfor1 小时前
云原生学习
java·分布式·学习·阿里云·云原生
明志致远淡泊宁静1 小时前
记录一次服务器redis被入侵
运维·服务器·redis
程序猿麦小七1 小时前
今天给在家介绍一篇基于jsp的旅游网站设计与实现
java·源码·旅游·景区·酒店