SpringBoot + Redis 多级缓存 + L1/L2 自动同步:本地缓存与 Redis 一致性保障
一、缓存一致性的噩梦 之前参与过一个电商平台,使用了SpringBoot + Redis缓存架构。为了提高性能,在应用层也加入了本地缓存(Caffeine),形成了二级缓存架构: L1缓存:本地缓存(Caffeine),响应速度快 L2缓存:Redis缓存,支持分布式 原本以为这样可以兼顾性能和一致性,但实际运行中却出现了严重的缓存不一致问题。 用户在APP上看到的商品价格和库存信息经常与实际不符,有时候明明已经缺货的商品,页面上还显示有库存,导致用户下单后无法发货,投诉不断。 "我们的缓存更新策略是:修改数据时,先更新数据库,然后删除本地缓存,再删除Redis缓存。但还是会出现不一致的情况。" 这样的场景,作为后端开发的你,是不是也遇到过? 二、多级缓存一致性的挑战 在多级缓存架构中,一致性问题主要来自以下几个方面: 1. 更新顺序问题 如果先更新数据库,再删除缓存,可能会出现: 线程A:读取数据,发现缓存不存在 线程A:从数据库读取数据 线程B:更新数据库 线程B:删除缓存 线程A:将读取到的旧数据写入缓存 结果:缓存中存储的是旧数据 如果先删除缓存,再更新数据库,....