1. 缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统(比如DB)带来很大压力。
- 解决方案:
- 缓存失效时间设置1-5分钟的随机数,保证缓存不在同一时间集体失效。
- 异步加载或更新缓存,保证真正使用缓存时已经提前更新完成。
2. 缓存穿透
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
- 解决方案:
- 使用布隆过滤器、用极少资源判定key一定不存在。
- 将没有的数据缓存成null。 (不推荐,如果有大量穿透攻击,则会压垮Redis)
3.缓存击穿
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
- 解决方案:
- 缓存失效时使用Redis的mutex key实现互斥锁,保证一个线程去更换缓存,其他线程排队等待,等缓存更新完毕后,其他线程获取缓存后的结果。
网友评论