Redis 缓存
缓存雪崩
- 大量缓存数据同时过期
- Redis 服务宕机
在以上两种情况下,大量请求进来后直接访问数据库,导致数据库宕机,进而可能导致整个系统崩溃。
大量缓存同时过期
应对方法:
- 均匀地设置过期时间:在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数
- 互斥锁:如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存,这样当缓存不存在时,只有一个请求到达数据库,其它请求则阻塞等待。(锁需要设置过期时间)
- 后台更新缓存:将更新缓存的工作交由后台线程定时更新,往往在启动时就先进行缓存预热。
- 方法一:后台定时检测缓存是否失效,如果失效了则更新;
- 方法二:业务发现缓存失效后,通过消息队列通知后台线程更新缓存;
Redis 服务宕机
- 方法一:启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不用再继续访问数据库;
- 方法二:限流,保证到达数据库的请求不超过数据库的负载;
- 方法三:构建 Redis 集群;
缓存击穿
热 key 失效:
- 互斥锁方案,保证同一时间只有一个业务线程更新缓存。
- 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;
缓存穿透
缓存不存在且无法构建。
比如用户访问的数据既不在缓存中,请求数据库后也无法获取。
可能原因:
- 业务操作有误
- 恶意攻击
解决方案:
- 非法请求限制:在入口处就进行参数检查;
- 缓存空值或默认值:即便无法获取到真正的需求数据,也直接在缓存中加入一个默认数据;
- 布隆过滤器: