这事复杂在缓存击穿,其实很简单。先说最重要的,缓存击穿是指当热点key在失效后,突然有大量请求访问这个key,导致缓存服务器压力剧增的情况。去年我们跑的那个项目,大概3000量级用户同时在线,就因为缓存击穿,系统直接卡死。另外一点,缓存击穿通常发生在缓存过期时,这时候如果数据库也恰好挂了,那么后果不堪设想。
我一开始也以为缓存击穿只会在缓存失效时发生,后来发现不对,还有个细节挺关键的,那就是当缓存中的热点key突然过期,而数据库中这个key的数据又不存在时,也会触发缓存击穿。用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。
说实话挺坑的,这个点很多人没注意。我觉得值得试试的方法是使用互斥锁,比如Redis的SETNX命令,可以保证在缓存失效的短时间内,只有一个请求去数据库获取数据,其他请求则等待。等等,还有个事,就是可以考虑使用预热策略,提前加载热点数据到缓存中,减少缓存击穿的风险。
缓存击穿,2021年某电商秒杀活动,1秒内请求量达千万,导致缓存服务崩溃。这就是坑,别信缓存永不失效。
缓存击穿这个事儿啊,得从2013年说起。那时候我还在一家电商公司做运维,那会儿的缓存系统是Redis,挺先进的。缓存击穿啊,简单说就是当你缓存的数据过期了,这时候刚好有大量的请求过来,而这些请求都需要去查询数据库,那数据库的压力就大了。
当时我记得有个场景,晚上11点整,系统自动刷新缓存,结果那一瞬间访问量激增,直接导致数据库挂了。当时也没想明白,怎么就突然这么多人访问呢?后来一分析,原来是某个热销商品的库存信息过期了,用户一看库存为0,赶紧抢购,结果就出了这个问题。
当时那个解决方法啊,就是设置了热点数据的永不过期,这样就能保证即使缓存过期了,用户访问的还是最新的数据。不过说实话,这种方法也有缺点,就是会占用更多的内存。
总之啊,缓存击穿这个事儿,得看具体场景,有时候是数据热点问题,有时候是缓存过期策略不当。咱们这行,就是得根据实际情况来调整策略,保证系统稳定运行。