- 如果请求的数据,在缓存中和数据库中都没有找到符合条件的数据,这种情况叫做缓存穿透。
- 主要原因是:查询某个key对应的数据,Redis缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而Redis也不会缓存这个空结果。这就造成每次通过这样的key去查询数据都会直接到数据库中查询,Redis不会缓存空结果。这就造成了缓存穿透的问题。
- 把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间。
- 使用布隆过滤器。布隆过滤器可以针对大数据量的、有规律的键值进行处理。
- 缓存中的数据在某个时刻批量过期,导致大部分用户的请求都会直接落在数据库上,这种现象叫作缓存击穿。
- 主要原因是:缓存中的数据设置了过期时间,某个时刻从数据库中获取了大量的数据,并设置了相同的过期时间,这些缓存的数据就会在同一时刻失效,造成缓存击穿问题。
- 热点数据永不过期
- 在访问数据的时候,更新缓存中的数据过期时间
- 批量入缓存的数据,分配合理的过期时间,避免同一时刻失效
- 使用分布式锁,保证每一个key同时只有一个线程去查询后端的服务
- 在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量直接到达数据库。数据库的调用量就会暴增,用不了多长时间,数据库就会被大流量压垮,这种级联式的服务故障,就叫做服务雪崩
- 保证Redis的高可用,将Redis缓存部署成高可用集群(必要时做成异地多活)
- 限流降级的方式防止缓存雪崩
- 使用预热的方式将数据加载到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效