gpt4 book ai didi

java - Spring @Cacheable : Preserve old value on error

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:47 26 4
gpt4 key购买 nike

我打算使用 Spring @Cacheable 注释来缓存调用方法的结果。

但是这个实现对我来说看起来不太“安全”。据我了解,返回值将由底层缓存引擎缓存,并在调用 Spring evict 方法时删除。

我需要一个在加载新值之前不会破坏旧值的实现。这是必需的,以下情况应该有效:

  1. 调用可缓存方法 -> 返回有效结果
  2. 结果将由 Spring @Cacheable 后端缓存
  3. Spring 使缓存失效,因为它已过期(例如 1 小时的 TTL)
  4. 再次调用可缓存方法 -> 返回异常/空值!
  5. 旧结果将被再次缓存,因此,该方法的 future 调用将返回有效结果

这怎么可能?

最佳答案

如果 @Cacheable 方法抛出异常,您提供旧值的要求可以通过对 Google Guava 的最小扩展轻松实现。

使用下面的示例配置

@Configuration
@EnableWebMvc
@EnableCaching
@ComponentScan("com.yonosoft.poc.cache")
public class ApplicationConfig extends CachingConfigurerSupport {
@Bean
@Override
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();

GuavaCache todoCache = new GuavaCache("todo", CacheBuilder.newBuilder()
.refreshAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10)
.build(new CacheLoader<Object, Object>() {
@Override
public Object load(Object key) throws Exception {
CacheKey cacheKey = (CacheKey)key;
return cacheKey.method.invoke(cacheKey.target, cacheKey.params);
}
}));

simpleCacheManager.setCaches(Arrays.asList(todoCache));

return simpleCacheManager;
}

@Bean
@Override
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
return new CacheKey(target, method, params);
}
};
}

private class CacheKey extends SimpleKey {
private static final long serialVersionUID = -1013132832917334168L;
private Object target;
private Method method;
private Object[] params;

private CacheKey(Object target, Method method, Object... params) {
super(params);
this.target = target;
this.method = method;
this.params = params;
}
}
}

CacheKey 服务于公开 SimpleKey 属性的单一目的。 Guavas refreshAfterWrite 将配置刷新时间而不会使缓存条目过期。如果使用 @Cacheable 注释的方法抛出异常,缓存将继续提供旧值,直到由于 maximumSize 被逐出或被成功方法响应的新值替换。您可以将 refreshAfterWriteexpireAfterAccessexpireAfterAccess 结合使用。

关于java - Spring @Cacheable : Preserve old value on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com