使用Spring Cacheable的L1 + L2缓存策略

Adi*_*l F 3 spring-data-redis spring-boot spring-cache caffeine

我正在尝试设置 L1 + L2 缓存策略以与@Cacheable注释一起使用。我的目标是

  1. 配置咖啡因缓存
  2. 配置Redis缓存
  3. 在 Caffeine Cache 中查找项目,如果找到则返回,否则执行步骤 4
  4. 在Redis缓存中查找项目,如果找到则返回并缓存在caffeine中,否则执行第5步
  5. 使用真实服务返回结果。

我知道这不受开箱即用的支持,但我一直在尝试阅读有关如何连接此类解决方案的文档。

我当前的解决方案是将我的实际服务包装在RedisBackedService具有注释的 a 中,而该服务又包装在具有注释的a 中。不用说,这似乎是多余的。redisCacheManagercacheableCaffeineBackedServicecaffeineCacheManagercacheable

任何指示都会有帮助。

Ste*_*oll 5

因此,在这里总结并根据评论提供答案,这不是缓存抽象的功能,但缓存抽象的 SPI 足够简单,您可以自己实现一些东西。

public class FallbackCache implements Cache {

  private final Cache primaryCache;
  private final Cache fallbackCache;

  FallbackCache(Cache primaryCache, Cache fallbackCache) { ... }

  public ValueWrapper get(Object key) {
    ValueWrapper wrapper = primaryCache.get(key);
    if (wrapper != null) {
      return wrapper;
    }
    return fallbackCache.get(key);
  }

  // other methods

}
Run Code Online (Sandbox Code Playgroud)

对于此用例,某些方法(例如本机缓存访问器)可能有点棘手。我将返回主缓存并隐藏调用者有回退的事实。

如果您预先知道缓存,那么您可以创建它们并将它们包装在SimpleCacheManager. 如果您需要动态创建它们,CacheManagerAPI 要求您实现两个简单的方法。