缓存穿透
指查询一个一定不存在的数据,由于缓存未命中导致这个不存在的数据每次都要到存储层查询,大量的请求会使数据库挂掉
解决方案
- 把无效的 key 存入 Redis,查询时先在 Redis 内部判断是否存在。如果每次的 key 都不同会使这种方案失去意义。
- 布隆过滤器。布隆过滤器判断某个 key 不存在,那么一定不存在;判断某个 key 存在,那么极大可能存在。
缓存雪崩
指在设置缓存时使用了相同的过期时间,导致缓存在某时刻同时失效,此时可能会有大量请求全部转发到数据库。
解决方案
在失效时间基础上添加随机值
缓存击穿
对于某个热点数据在过期时可以会面临超高并发访问,同一个 key 对应的大量请求转发至数据库。
解决方案
- 使用互斥锁(Mutex)。在缓存失效时不立即访问数据库,而是先设置一个互斥锁(如 Redis 的 setnx 操作),当操作返回成功时再进行数据库访问,否则尝试重新获取缓存。也可以在缓存即将失效时设置互斥锁并更新缓存数据。
- 设置热点数据永不过期。可以是缓存没有过期时间,也可以手动更新过期时间使缓存不过期。