1. @CachePut/@CacheEvict 与一致性
Spring 的 @CachePut 与 @CacheEvict 注解如何与缓存一致性结合使用?
- @CachePut 主动更新缓存 vs @CacheEvict 删除缓存
- 与数据库更新的时序
- 一致性取舍
@CachePut 在方法执行后把返回值写入缓存,@CacheEvict 在方法执行后删除指定缓存。两者配合数据库更新时,典型做法是"先更新数据库再删除缓存"(Cache-Aside),用 @CacheEvict 保证下次读取重建缓存,避免更新缓存与并发写造成的不一致。@CachePut 适用于"读多写少且写后立即读"的场景,但双写缓存与数据库存在竞态(先写缓存后写 DB 失败导致缓存脏数据)。一致性上,@CacheEvict 删除缓存更安全(即使删除失败也可靠过期兜底),@CachePut 直接写值需更谨慎地处理失败。
缓存一致性本质是"数据库与缓存谁先谁后"。删除缓存比更新缓存更不易出错,配合 TTL 与消息通知(如 Canal/延迟双删)可进一步收敛。