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期间,突然某个商品缓存没了。一大波请求直接到达,全都去请求数据库了。

解决方案:

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

相关推荐
Sherry0079 分钟前
【译】🔥如何居中一个 Div?看这篇就够了
前端·css·面试
苦学编程的谢18 分钟前
Redis_5_单线程模型
数据库·redis·缓存
Mos_x20 分钟前
15.<Spring Boot 日志>
java·后端
mm-q291522272923 分钟前
Java并发编程从入门到进阶 多场景实战
java·开发语言
Violet_YSWY30 分钟前
任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存【示例】
java·数据结构
SimonKing37 分钟前
你的项目还在用MyBatis吗?或许这个框架更适合你:Easy-Query
java·后端·程序员
nice_lcj52038 分钟前
认识多线程:单例模式
java·开发语言·单例模式
货拉拉技术40 分钟前
从代码到配置:如何用SQL配置实现数据核对
java·后端
程序员小假1 小时前
设计模式了解吗,知道什么是饿汉式和懒汉式吗?
java·后端
拾忆,想起1 小时前
TCP粘包拆包全解析:数据流中的“藕断丝连”与“一刀两断”
java·网络·数据库·网络协议·tcp/ip·哈希算法