Spring JCache日志记录缓存命中

时间:2019-02-26 18:12:55

标签: spring caching jcache jsr107

我有一种方法,可以通过添加@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,但它们都没有缓存返回结果时的事件(非null)。

我真的不需要更改实现以编程方式使用缓存而不是使用批注(我实际上有很多服务需要更改,而不仅仅是其中一项),是否有记录这些日志的好方法事件吗?

1 个答案:

答案 0 :(得分:1)

关于该主题的想法。大概前两个是最相关的:

不要:在Spring中执行的代码以及命中的缓存中的相应缓存是最关键的代码。这就是为什么在这种情况下让其他代码调用甚至选择不那么聪明的原因。记录日志会严重影响您的性能。通常,对于导致缓存请求的所有内容(例如传入的Web请求),已经在应用程序中进行了登录。为了弄清缓存是否正常工作,只需点击一下计数器即可。可以通过JCache JMX统计信息获得。

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

通过ExpiryPolicy进行攻击:当指定了自定义ExpiryPolicy时,JCache实现将在每次缓存访问时调用方法getExpiryForAccess。但是,您没有获得有关请求的实际密钥的任何信息。由于性能原因,我还建议不要使用自己的ExpiryPolicy实现。所以这只是为了完整性。

记录缓存/记录每次访问:如果您指定了多个缓存,Spring会依次调用它们。您可以将虚拟缓存连接为第一个缓存,该缓存仅记录访问。