缓存穿透
缓存穿透:指用户不断请求缓存和数据库中都不存在的数据,导致请求不经过缓存,直接落到数据库上。
解决办法有:
- 增加参数校验,或者拉黑访问过于频繁的 ip。
- 缓存无效的 key,并设置过期时间,适用于 key 变化不频繁的情况。
- 使用布隆过滤器,将所有存在的数据哈希到 Redis 的 bitmap 中。加入时,通过多个 hash 确定多个数组下标,将值置为 1。 然后判断时,以同样的方式 hash 确定下标,若值都为 1,则说明存在,否则说明不存在。但数组大小有限,不同数据可能哈希出来的位置相同,所以有误差,可能会误拦截存在的数据。
缓存雪崩
缓存雪崩:指缓存大面积失效,导致大量请求直接落到数据库,把数据库打崩。
解决办法有:
- 为每个 key 的失效时间加上随机值,避免同时失效。
- 如果 Redis 是集群部署,将热点数据均匀分布在不同的 Redis 库中也能避免同时失效。
- 设置热点数据永远不过期,并且选择合适的数据淘汰策略,避免缓存被耗尽。
缓存击穿
缓存击穿:指热点数据过期瞬间,有大量请求击穿 Redis,直接落到数据库。
解决方法有:
- 设置热点数据永远不过期,并且选择合适的数据淘汰策略,避免缓存被耗尽。
- 加互斥锁,比如 synchronized、ReentrantLock,或者在 Redis 中使用 SETNX(set if not exists)
命令实现分布式锁。