前两天帮人看个线上问题,用户投诉说余额对不上。查了半天才定位到,库里那行早改了,缓存里躺的还是三天前的老数。根子特简单:写入的时候忘了给缓存设 TTL,它就很"忠诚"地一直替你记着那个过时的真相,你不主动让它失效,它就默认那些数据永远是对的,记到天荒地老。
这种坑其实不止一种长相。热点 key 到点突然过期的那一瞬间,海量请求齐刷刷穿透到数据库,直接把 DB 打挂,这种叫 cache 击穿,比雪崩还让人措手不及。还有更隐蔽的一种:先改库还是先删缓存,顺序一旦搞反,脏数据就常驻在缓存里,你后面怎么刷新都对不上,两边永远差着那么一截,像卡了根刺。
缓存说白了就是个替你记事的小本子,它自己不判断数据新不新,只认你给的指令。你懒得管失效这档子事,它就替你记得比你更久,久到出事为止。所以但凡动到写路径,先想清楚那条缓存该什么时候死,比事后对着监控抓瞎强