Spring Cache拦截器

时间:2017-09-24 09:05:51

标签: java spring spring-boot hazelcast spring-cache

我们依靠一个系统来提供往往会经常出现故障的信息。目前,我们使用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);
    }
}

由于“参考系统”不可用,因此没有缓存提取失败

1 个答案:

答案 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;在那里,您可以从任何来源检查/获取新数据。