目录
1.缓存穿透
缓存击穿是指一个非常热点的key在缓存过期后,同时有大量的并发请求访问,导致这些请求都直接打到数据库上,造成瞬间的数据库压力暴增。与缓存雪崩不同,缓存击穿是指单个key的缓存过期,在高并发情况下引起的问题。
为了避免缓存击穿,可以采取以下几种措施:
-
使用互斥锁(Mutex Lock):在缓存失效的时候,通过加锁的方式保证只有一个线程去查询数据库,而其他线程则等待该线程的查询结果,从而避免了大量并发请求同时打到数据库上。
-
针对热点数据永不过期:对于重要的热点数据,可以设置其永不过期,以保证热点数据不会过期引起缓存击穿。
-
加载缓存数据时限流:在缓存失效后,可以对数据库的查询进行限流控制,防止大量请求同时访问数据库。
-
提前异步刷新缓存:在缓存过期之前,可以通过定时任务或者后台线程提前异步加载缓存数据,避免在大量请求到来时才去加载数据。
-
使用"缓存穿透"的解决方案:比如使用布隆过滤器,对查询结果为空的数据同样进行缓存存储,避免非法请求绕过缓存直接打到数据库上。
2.缓存雪崩
缓存雪崩是指缓存中的大量数据同时失效或者因某些原因导致缓存失效,而后续的请求无法命中缓存,导致大量请求直接打到数据库或后端系统,产生瞬时并严重的系统性能问题,甚至引起系统瘫痪的现象。
缓存雪崩通常发生在以下情况下:
-
缓存服务器宕机:如果所有的缓存服务器在某个时间点都宕机了,那么后续的所有请求都将直接打到后端系统,造成瞬时的流量激增。
-
大规模缓存同时过期:当缓存中的大量数据在同一时间段内过期,而后续的请求无法命中缓存时,也会导致大量请求直接打到后端系统。
为了避免缓存雪崩,可以采取以下几种措施:
-
设置合理的过期时间:合理分散缓存数据的过期时间,避免大量数据在同一时间段过期。
-
使用多级缓存架构:将缓存分为多级,不同数据使用不同的过期时间,避免全部数据同时失效。
-
热点数据永不过期:对一些热点数据设置不过期,确保即使缓存过期,仍能从缓存中获取到这部分热点数据,减轻对数据库的压力。
-
缓存预热:系统启动时可通过加载缓存数据预热的方式,逐步将大部分热点数据加载到缓存中。
-
引入限流措施:通过合理的限流策略,对流量进行控制,避免过多的请求在缓存失效后一次性打到后端系统。
3.缓存击穿
缓存击穿是指一个非常热点的key在缓存过期后,同时有大量的并发请求访问,导致这些请求都直接打到数据库上,造成瞬间的数据库压力暴增。与缓存雪崩不同,缓存击穿是指单个key的缓存过期,在高并发情况下引起的问题。
为了避免缓存击穿,可以采取以下几种措施:
-
使用互斥锁(Mutex Lock):在缓存失效的时候,通过加锁的方式保证只有一个线程去查询数据库,而其他线程则等待该线程的查询结果,从而避免了大量并发请求同时打到数据库上。
-
针对热点数据永不过期:对于重要的热点数据,可以设置其永不过期,以保证热点数据不会过期引起缓存击穿。
-
加载缓存数据时限流:在缓存失效后,可以对数据库的查询进行限流控制,防止大量请求同时访问数据库。
-
提前异步刷新缓存:在缓存过期之前,可以通过定时任务或者后台线程提前异步加载缓存数据,避免在大量请求到来时才去加载数据。
-
使用"缓存穿透"的解决方案:比如使用布隆过滤器,对查询结果为空的数据同样进行缓存存储,避免非法请求绕过缓存直接打到数据库上。