缓存击穿、穿透、雪崩
缓存击穿
高并发系统中,大量的请求一般会落在缓存,但在某一时期,某一热点key过期,会导致大量的请求直接落到数据库,导致数据库崩溃。
解决
- 设置热点key不过期。
- 加上分布式锁,每次只有拿到锁的线程可以去访问数据库。第一个线程查询到后就会缓存起来,后面线程从缓存中拿。
缓存穿透
正常情况下,需要查询的数据都存在,当查询一个缓存和数据库都不存在的数据时,每次请求都会落在数据库里,这种情况成称为缓存穿透。就是以一个不存在的数据去请求,每次都会落到数据库。
解决:
- 接口增加参数校验,不合法的直接返回。
- 缓存空值,将对应key的value设置为空值,避免暴力攻击。同时将key失效时间设置短一些,避免影响正常使用。
- 在网关阈值,限制同ip访问量。
- 高级用户布隆过滤器。bloom filter,可以对key进行判断是否在数据库存在,不存在就直接返回,存在就查询出来,并刷新缓存。
缓存雪崩
某一时期发生的大规模的缓存不可用问题,过期,宕机。
解决:
- 采用分布式集群,减少宕机风险。
- 将失效时间设为随机数,避免大量同时失效。
- 采用本地缓存加限流逻辑。
相关文章