弹簧JCACHE记录缓存命中



我有一种方法,通过添加@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(我使用的实现),并且我只找到了(与听众)侦听以下事件的方式:创建,更新,删除,驱逐,驱逐,过期,但没有一个缓存返回结果(而不是null)时的事件。

我真的不想更改实现来以编程方式使用缓存而不是使用注释(我实际上有很多更改的服务,而不仅仅是一个),是否有一种很好的方法来记录这些事件反正?

对该主题的想法。可能,前两个是最相关的:

不要:在春季执行的代码和缓存命中率相应的缓存是最关键的代码。这就是为什么在这种情况下呼叫其他代码,甚至可以选择此事的原因并不那么聪明。日志中的接线将极大地影响您的性能。通常,有关导致缓存请求的所有内容的应用程序已经有记录(例如,启发Web请求)。要了解缓存是否正常工作,命中的反击就足够了。可以通过JCACHE JMX统计信息获得。

记录适配器:使用Spring,您可以编写一个缓存适配器,该缓存适配器可根据需要进行日志记录,并通过配置将其连接到。粗略的想法:查看CacheManagerCache接口。包装CacheManager创建缓存方法,然后返回带有记录的包装缓存。

通过expirypolicy hack :指定自定义ExpiryPolicy时,JCACHE实现将在每个缓存访问中调用方法getExpiryForAccess。但是,您没有获得有关所请求的实际键的任何信息。由于性能原因,我还建议远离自己的ExpiryPolicy实现。因此,这只是为了完整。

记录缓存/日志每个访问:如果您指定了多个缓存,则Spring将它们接一个地称为。您可以将虚拟缓存连接为第一个缓存,该缓存仅记录访问。

最新更新