You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis性能瓶颈下的两级缓存(Caffeine+Redis)实现问题咨询

两级缓存实现问题求助

背景

应用性能分析发现Redis导致线程大量休眠,拖慢执行时间,计划实现两级缓存解决:

  • L1:每个部署实例的本地缓存
  • L2:同一部署所有实例共享的全局缓存

当前实现方案

  • 创建两个CacheManager:CaffeineCacheManager(本地缓存)和RedisCacheManager(全局缓存)
  • 为两个CacheManager初始化同名的缓存
  • 使用@Caching注解结合多个@Cacheable实现双缓存

代码示例:

@Caching(cacheable = {
        @Cacheable(cacheNames = CacheConfiguration.HELLO_WORLD),
        @Cacheable(cacheNames = CacheConfiguration.HELLO_WORLD, cacheManager = "cacheManagerRedis")
})
public String generate(String name)
{
    log.info("  Cached method call...");
    return helloWorldService.generate(name);
}

类调用结构:CachedService(缓存注解在此类)-> NonCachedService

当前遇到的问题

预期流程验证(y=正常/n=异常):

  • [ y ] 数据生成后同时写入Redis和本地缓存 - 正常
  • [ y ] 本地缓存存在时,直接读取本地缓存不访问Redis - 正常
  • [ y ] 任一缓存存在数据时,直接从缓存获取 - 正常
  • [ n ] Redis缓存存在但本地缓存缺失时,无法将Redis数据同步到本地缓存 - 异常

尝试通过添加@CachePut注解把Redis中的数据同步到本地缓存,结果导致整个缓存逻辑失效:

@Caching(cacheable = {
        @Cacheable(cacheNames = CacheConfiguration.HELLO_WORLD),
        @Cacheable(cacheNames = CacheConfiguration.HELLO_WORLD, cacheManager = "cacheManagerRedis")
}, put = {
        @CachePut(cacheNames = CacheConfiguration.HELLO_WORLD),
})
public String generate(String name)
{
    log.info("  Cached method call...");
    return helloWorldService.generate(name);
}

咨询问题

  1. Spring有没有原生的两级缓存解决方案?
  2. 了解过Redis本地缓存,但不符合我的场景(它只是Redis的标准用法)。
  3. 是不是只能通过双层服务结构(CachedLocal->CachedRedis->NonCached)来实现需求?

内容的提问来源于stack exchange,提问作者siwonpawel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:18:55