Redis是否支持Spring Framework的@Cacheable(sync = true)注解?
Redis对@Cacheable(sync=true)的支持说明
首先明确:Spring Cache的@Cacheable(sync=true)特性,Spring Data Redis(Redis作为缓存后端)是支持的,你的场景没生效大概率是配置或使用细节出了问题,以下是关键要点和排查方向:
核心原理回顾
当sync=true时,同一缓存key的并发请求中,只有第一个线程会执行目标服务逻辑,其他线程会阻塞等待第一个线程将结果写入缓存后,直接读取缓存值,以此避免缓存击穿。
Redis支持该特性的前提
- Spring Data Redis版本要求:必须使用2.0及以上版本,早期版本对
sync的实现存在缺陷,无法正常生效。 - 缓存配置无异常:默认的
RedisCacheManager已经支持同步逻辑,如果你自定义了RedisCacheConfiguration,不要覆盖或禁用相关同步机制,比如确保RedisCacheWriter是正确初始化的(同步逻辑依赖它的锁实现)。 - KeyGenerator生成的key必须完全一致:你自定义的
myGenerator要保证并发请求生成的key完全相同——sync机制是基于缓存key做线程同步的,key不同的话,每个线程都会认为是不同的缓存项,自然都会执行服务逻辑。
排查步骤
- 验证KeyGenerator的输出:在
myGenerator的生成方法中添加日志,打印每次生成的key,确认并发请求时输出的key完全一致。 - 检查依赖版本:查看项目依赖中Spring Data Redis的版本,确保≥2.0.x。
- 简化场景测试:搭建一个最小测试用例,只保留
@Cacheable(sync=true)的基本配置,模拟两个线程同时调用,观察是否只有一个线程执行服务逻辑。 - 排查Redis写入问题:检查Redis服务器是否正常,缓存是否成功写入——如果第一个线程的结果没写入Redis,后续线程还是会执行方法。
内容的提问来源于stack exchange,提问作者ponder275
相关产品推荐
相关产品推荐

