一、缓存击穿
1.什么是缓存击穿
缓存击穿也就是说当redis缓存中有一个key是大量请求同时访问的热点数据,如果突然这个key时间到了,那么大量的请求在缓存中获取不到该key,穿过缓存直接来到数据库导致数据库崩溃,这样因为单个key失效而穿过缓存到数据库称为缓存击穿。
2.怎么办,怎么解决
- 最简单粗暴的解决方案就是让热点key不设置过期时间,即key一直存在于缓存中,更新时直接覆盖即可。
- 设置定时任务检测要过期的key,然后在将要过期的时候重新从数据库把数据刷新到缓存中,这样的方式增加系统复杂度,并且实现复杂。
- 使用互斥锁的方案,在缓存中没有数据去数据库查询时加上锁,让一个线程去查询数据库以及更新缓存,其他线程等待,这样减小数据库压力。
二、缓存雪崩
1.什么是缓存雪崩
为了使查询速度更快,我们选择使用缓存来保存数据,使原本每次请求都需要查询数据库的操作变成先查询缓存,缓存有直接返回,缓存没有则查询数据库然后再写入缓存中,通常缓存都是有有效时长的,否则就会一直占用内存空间。
当大量请求在访问都会先从缓存查询,如果此时大部分缓存同时过期失效,那么这些请求都查询不到缓存,此时他们会全部将请求到数据库,当请求数量足够大时此时将会把数据库压垮,这就是缓存雪崩。比如在凌晨十二点搞促销,大约有10000个用户发起请求,此时缓存过期,则这10000个请求直接打到数据库上,把数据库压垮,即使重启数据库请求依然会打到数据库上。
2.怎么办,怎么解决
- 不设置过期时间,缓存更新直接刷新。
- 过期时间上加随机值,避免缓存集中过期。
- 使用集群将数据均匀分布在机器上。
- 采取一定的限流降级机制,防止大量请求搞垮数据库。
三、缓存穿透
1.什么是缓存穿透
指当请求查询缓存和数据库都不存在的数据时,先查询缓存为空,再查询数据库依然为空,向请求返回空,如果大量请求同时访问这些不存在key那么这些请求依然会造成压垮数据库的现象,这种通常是恶意查询和被攻击几率较大。
同样的请求一直出现,会造成压垮数据库的现象。
2.怎么办,怎么解决
- 缓存中存放查询的key,值设置为空,这样就能避免请求打到数据库,但是这样就会占用缓存空间。
- 在请求接口处做检查,如用户鉴权、参数校验等,对于不合法的请求直接返回,这样能够拦截部分不合法的请求。
- 使用布隆过滤器。
总结
缓存雪崩、缓存击穿、缓存穿透是生产和面试中常见的问题,在请求量小的时候这些问题造成的影响不大,但是一旦访问量大起来这些问题将会造成服务器宕机,甚至在重启服务器之后依然会扛不住压力继续宕机,只有提前为数据做好分析准备,选用合适方案进行解决才能够尽可能的减小生产服务器损失。