缓存穿透
缓存穿透:
如一个用户的基本信息(缓存key为userId),缓存和数据库里面都没有这个userId的信息,但是如果有请求要获取这个信息,那么就会跨过缓存去查数据库,如果这样的请求短时间内比较多非常多可能会压垮数据库。
解决方案
1. 接口层增加校验,如:用户鉴权校验,id基础校验,id<=0的直接拦截;
2. 缓存没有取到,数据库也没有取到,这时也可以将key-value对写成key-null缓存起来,缓存有效时间可设置短一些,如:30秒(设置太长会导致正常情况也没法使用)
缓存击穿
缓存击穿:
指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时查询缓存未读到该数据,又同时去数据库中取该数据,造成数据库压力过大。
解决方案
1. 设置热点数据有效时间加长,或者永不过期;
2. 加互斥锁;
2. 接口限流、熔断、降级;
缓存雪崩
缓存雪崩:
缓存数据大批量过期,查询数据量巨大会落到数据库上,导致数据库压力过大。
解决方案
1. 缓存数据的过期时间随机设置,防止同一时间大批量数据同时过期;
2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中;
3. 设置热点数据有效时间加长,或者永不过期;
缓存降级
缓存降级:
高并发高负载情况下,选择动态关闭一些非核心的服务,拒绝访问或限流等,保证核心服务可用。
解决方案
1. 比如:电商平台秒杀当天可关闭推荐功等能;