【发布时间】:2019-03-19 10:39:54
【问题描述】:
我有一个方法,我通过添加@CacheResult 注释来添加缓存(我实际上创建了一个代理,因为我无法更改SomethingService 的原始实现):
@Service
public class SomethingServiceProxyImpl implements SomethingService {
@Autowired
@Qualifier("somethingService")
SomethingService somethingService;
@Override
@CacheResult(cacheName = "somethingCache", exceptionCacheName = "somethingExceptionCache", cachedExceptions = { SomeException.class })
public SomePojo someMethod(String someArg) {
return somethingService.someMethod(someArg);
}
}
我现在需要的是能够记录缓存命中,这意味着返回的结果是来自缓存的结果。我已经查看了 Spring Cache、JCache 和 EHCache(我使用的实现),我只找到了侦听(使用侦听器)以下事件的方法:CREATED、UPDATED、REMOVED、EVICTED、EXPIRED 但它们都没有缓存返回结果(非空)时的事件。
我真的不想更改实现以编程方式使用缓存而不是使用注释(我实际上有很多服务要更改,而不仅仅是一个),有没有好方法来记录这些到底有什么活动?
【问题讨论】:
-
JCache 不会为每个缓存命中产生一个事件。我认为只有拥有调用
cache.get的代码才能跟踪缓存命中。 -
我发现,遗憾的是,执行 cache.get 的代码在 Spring Framework 内部,它是 CacheResultInterceptor,它是一个包私有类。
-
你有围绕缓存命中的业务逻辑吗?如果没有,您可以启用统计以获取累积的指标。
-
客户端希望应用程序日志中的缓存命中,因此通过我们的 ELK,他可以在我们的 Kibana 上获取这些指标。最后我告诉客户端从缓存创建中减去请求以获得缓存命中。
标签: spring caching jcache jsr107