什么是缓存击穿?如何解决?
缓存击穿是指当缓存中没有某个key的数据,这当然会导致缓存无法命中,然后请求就会穿透缓存层,直接访问数据库。如果这个不命中的请求不止一个,而是成千上万个同时发生,那么就会对数据库形成巨大的访问压力,可能会导致数据库访问瞬间崩溃。
最常见的缓存击穿场景就是有大量请求同时查询一个热点key,但是此时缓存中该key的数据刚好过期,于是大量的请求就会直接穿透到数据库。
针对缓存击穿问题,常见的解决方案有:
- 设置热点数据永不过期:这种方法适用于某些更新不频繁但是访问非常频繁的热点数据。
-
缓存数据过期时间设置随机,防止同一时间大量数据过期现象发生。
-
使用互斥锁(Mutex key):对于同一个key,只允许一个线程去加载数据,其他线程等待加载完成直接使用即可。
-
服务降级与熔断:如果数据库压力过大,可以暂时拒绝部分请求,让系统在承受的压力范围内运行。
每种解决方案都各有优势,可以根据实际情况选择。