使用 Spring 可缓​​存的 L1 + L2 缓存策略

L1 + L2 caching strategy using Spring Cacheable

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

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

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

我目前的解决方案是将我的实际服务包装为 RedisBackedService,它在 cacheable 注释上具有 redisCacheManager,而后者又包装在 CaffeineBackedService 中在 cacheable 注释上有一个 caffeineCacheManager。不用说,好像多余。

任何指点都会有所帮助。

所以在此总结并根据评论提供答案,这不是缓存抽象的功能,但缓存抽象的 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

}

本机缓存访问器等某些方法对于此用例可能有点棘手。我会 return 主缓存并隐藏调用者有回退的事实。

如果您预先知道缓存,则可以创建它们并将它们包装在 SimpleCacheManager 中。如果您需要即时创建它们,CacheManager API 需要您实现两个简单的方法。