1.缓存穿透:是指一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查询数据库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至可能直接挂掉。用户进行请求,这意味着永远不会请求到该数据。如发起id=-1的数据请求或者一个id特别大都是不存在的数据,这相当于对服务器进行攻击。
解决方法:
接口层进行校验,如加用户权限校验和id的基础校验,用户没有登陆的无权请求,id<=0的直接拦截。
2.缓存击穿:是指缓存中没有但是数据库存在的数据(一般是缓存时间到期),是在并发用户的情况下发生大量请求,缓存中数据过期导致大量用户同一时间去查询数据库,造成数据库压力过大的情况。
解决方法:
1.设置热点数据永不过期
2.对服务接口进行限流、降级和熔断控制。如果服务请求量过多,进行限流和服务熔断,最后进行服务降级,快速返回服务响应。
3.加互斥锁
3.缓存雪崩:是指缓存大批量数据过期,用户并发访问大量数据,导致数据库压力过大甚至宕机。
它跟缓存击穿不同的是,缓存击穿是大量用户请求同一条数据;缓存雪崩是大量用户请求不同的数据,而且大量数据缓存已过期,只能请求数据库,导致数据库压力大增。
解决方法:
1.数据缓存的过期时间设置随机时间,防止大量缓存数据在同一时间过期;
2.设置热点数据永不过期。
3.如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。