使用 Spring 可缓存的 L1 + L2 缓存策略
L1 + L2 caching strategy using Spring Cacheable
我正在尝试设置 L1 + L2 缓存策略以与 @Cacheable
注释一起使用。我的 objective 是
- 配置咖啡因缓存
- 配置 Redis 缓存
- 在 Caffeine Cache 中查找项目,如果找到 return,否则执行第 4 步
- 在 Redis 缓存中查找项目,如果找到 return 并在咖啡因中缓存,否则执行第 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 需要您实现两个简单的方法。
我正在尝试设置 L1 + L2 缓存策略以与 @Cacheable
注释一起使用。我的 objective 是
- 配置咖啡因缓存
- 配置 Redis 缓存
- 在 Caffeine Cache 中查找项目,如果找到 return,否则执行第 4 步
- 在 Redis 缓存中查找项目,如果找到 return 并在咖啡因中缓存,否则执行第 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 需要您实现两个简单的方法。