缓存雪崩、缓存击穿、缓存穿透原因及解决办法
缓存雪崩是指在缓存中的大量数据在同一个时刻全部过期,导致原本这些可以由缓存中间件处理的高并发请求,一下子全部打到数据库,导致数据库服务器崩溃的一种现象。那么出现缓存雪崩的原因可以有①:缓存中间件宕机。②:缓存中大部分key都设置了相同的时间,导致这些key在同一时间内全部失效。解决的方法:
①:可以对这些个key设置可以失效的随机值,避免同时失效的问题。
②:还可以对数据库的读写加锁,不让那么瞬时高并发的请求一下子突然打到数据库上。
③:即使如果真的发生了缓存雪崩,使用数据库的主从复制、双主、读写分离等策略,数据库本身的容灾能力应该还是可以承受住的。
缓存穿透是指缓存穿透是指在使用缓存系统的应用程序中,恶意请求或者无效的请求频繁地访问缓存中不存在的数据,导致大量请求直接访问后端数据库或服务,而绕过了缓存系统的情况。可能出现的原因其实是可出现了恶意攻击行为。对于一个成熟的系统来说,由于缓存预热的不断加载,即便是出现了一个不存在的key,影响也不会很大,那么恶意攻击行为可能具有持久性,确认这个key在数据库中不存在,才会达到这样一个行为。解决的方法:
①:把这些无效的key保存到Redis里面,并设置一个null的特殊值,这样就不会去查数据库了。但是如果攻击者一直恶意攻击同样会出现相同的问题。
②:使用布隆过滤器来实现。把这些数据全部放到布隆过滤器里面,当进行查询时,先到布隆过滤器里面进行查询,如果查询不存在,那么这个key在数据库中肯定也不会存在,那么就不会去访问数据库了。
③:缓存预热,预先加载热点数据到缓存中,避免在某些特定时刻,高并发的请求打到数据库上。
缓存击穿是指当某个热点数据过期或被主动移除时,大量的并发请求同时访问该数据库,导致缓存无法命中,进而直接访问数据库或后端服务。对应的解决方案:
①:设置热点数据的永不过期策略:对于一些非常热点且不经常变动的数据,可以将其缓存设置为永不过期,确保数据一直存在于缓存中,避免了过期导致的击穿问题。
②:延迟缓存更新策略(缓存穿透):当发现某个缓存键对应的数据不存在时,可以采取一定的策略,如先访问数据库或后端服务获取数据,然后将数据写入缓存,避免了多个并发请求同时访问数据库。
③:布隆过滤器(Bloom Filter):布隆过滤器可以用于快速判断某个键是否存在于缓存中,如果布隆过滤器判断键不存在,则不会进一步访问缓存或数据库,从而减轻了缓存击穿的压力。
④:缓存预热(Cache Pre-warming):在系统启动或低峰期,预先加载热点数据到缓存中,使其在高峰期可用,从而避免了高并发请求直接访问数据库。
这里只列出来一小部分方案👀🤞