1、缓存穿透:指一个一定不存在的数据,由于缓存中没有数据会去查询数据库,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:
(1)将空对象也缓存起来,并给它设置一个很短的过期时间,最长不超过 5 分钟。
(2)采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
2、缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,就会造成缓存雪崩。
解决方案:尽量让失效的时间点不分布在同一个时间点。
3、缓存击穿:指一个 key 非常热点,在不停的扛着大并发,当这个 key 在失效的一瞬间,持续的大并发穿破缓存,直接访问数据库,就像在一个屏幕上凿了一个洞。
解决方案:可以设置 key 永不过期。