我们依靠一个系统来提供往往会经常出现故障的信息。目前,我们使用hazelcast来缓存条目,其中包含1小时的到期策略。然而,这存在一个问题,即缓存条目被盲目驱逐,因此如果系统不可用,请求将会失败一段时间。
我正在寻找一种方法来拦截spring的缓存以添加逻辑,松散地说我正在尝试修改内部的Spring调用
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<input type="hidden" value="[##cms.query.enable##]" id="inputi"/>
<div class="mysite">
<h1 class="activeyes"> Yes active </h1>
<h1 class="activeno"> No not active </h1>
</div>
到
Object valueFromCache = cache.getValue(cacheKey);
if (null == valueFromCache) {
valueFromCache = cachedMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
}
return valueFromCache;
基本上,我不想让底层缓存提供程序(我的实例中的hazelcast)决定何时驱逐条目,而只是在获取更新值的情况下才应用该应用程序。
我们可以处理稍微陈旧数据的风险,以获得更高的可用性。
编辑: 我想要一些与guava cachebuilder的refreshAfterWrite
类似的东西例如
Object valueFromCache = cache.getValue(cacheKey);
if (null == valueFromCache) {
valueFromCache = cachedMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
} else if (isValueExpired(valueFromCache)) {
try {
valueFromCache = cacheMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
} catch (FailedToRefreshDataException ex) {
doWhateverWithException(ex);
}
}
return valueFromCache;
输出
public static void main(String[] args) throws ExecutionException, InterruptedException {
AtomicInteger atomicInteger = new AtomicInteger();
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.refreshAfterWrite(100, MILLISECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String value) throws Exception {
int intValue = atomicInteger.incrementAndGet();
if (intValue % 2 == 0) {
throw new IllegalStateException("Failed to whatever");
}
return value + intValue;
}
});
for (int i = 0; i < 10; i++) {
System.out.println("Attempt " + i + "=" + cache.get("Shoes"));
Thread.sleep(50);
}
}
由于“参考系统”不可用,因此没有缓存提取失败
答案 0 :(得分:0)
如果Hazelcast需要refreshAfterWrite
,则为time-to-live-seconds
。
time-to-live-seconds
仅在您执行map.put
操作时更改,因此它与Guava的refreshAfterWrite
设置基本相同。
请参阅:http://docs.hazelcast.org/docs/3.8.6/manual/html-single/index.html#map-eviction
此外,您很可能希望在到期后刷新缓存中的数据。然后您可以使用MapLoader
或界面。 (http://docs.hazelcast.org/docs/3.8.6/manual/html-single/index.html#loading-and-storing-persistent-data)
这样,当数据过期时,下一次调用将会遇到MapLoader.load
方法&amp;在那里,您可以从任何来源检查/获取新数据。