3

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

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

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

我目前的解决方案是包装我的实际服务是 a RedisBackedService,它具有redisCacheManageroncacheable注释,而该服务又被包装在CaffeineBackedService具有 a注释的 acaffeineCacheManagercacheable。不用说,这似乎是多余的。

任何指针都会有所帮助。

4

1 回答 1

4

因此,在这里总结并根据评论提供答案,这不是缓存抽象的特性,但缓存抽象的 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

}

对于这个用例,像本机缓存访问器这样的一些方法可能有点棘手。我会返回主缓存并隐藏调用者有回退的事实。

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

于 2018-12-18T07:32:11.003 回答