Spring JCache 日志缓存命中
Spring JCache logging cache hits
我有一个方法,通过添加@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 缓存,JCache 和 EHCache(我使用的实现),我只找到了监听(与监听器)以下事件的方法:CREATED、UPDATED、REMOVED、EVICTED、EXPIRED 但是none 其中有缓存返回结果(非空)的事件。
我真的不想更改实现以编程方式使用缓存而不是使用注释(我实际上有很多服务要更改,而不仅仅是一个),有没有好的方法仍然记录这些事件?
关于那个话题的想法。可能前两个最相关:
不要:在Spring中执行的代码和缓存命中时的相应缓存是性能最关键的代码。这就是为什么 let 在这种情况下调用额外的代码,甚至有一个选项都不是那么聪明。在日志中连接会极大地影响您的性能。通常,所有导致缓存请求(例如传入的 Web 请求)的应用程序都已登录。要了解缓存是否正常工作,命中计数器就足够了。这可以通过 JCache JMX 统计信息获得。
日志记录适配器:使用Spring,您可以编写一个缓存适配器,根据需要进行日志记录并通过配置将其连接。大致思路:看一下CacheManager
和Cache
接口。包装 CacheManager
创建缓存方法和 return 带有日志记录的包装缓存。
通过 ExpiryPolicy 进行攻击:当指定自定义 ExpiryPolicy
时,JCache 实现会在每次缓存访问时调用方法 getExpiryForAccess
。但是,您不会获得有关所请求的实际密钥的任何信息。出于性能原因,我还建议远离自己的 ExpiryPolicy
实现。所以这只是为了完整性。
记录缓存/记录每次访问:如果您指定多个缓存,Spring会一个接一个地调用它们。您可以连接一个虚拟缓存作为第一个缓存,它只记录访问。
我有一个方法,通过添加@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 缓存,JCache 和 EHCache(我使用的实现),我只找到了监听(与监听器)以下事件的方法:CREATED、UPDATED、REMOVED、EVICTED、EXPIRED 但是none 其中有缓存返回结果(非空)的事件。
我真的不想更改实现以编程方式使用缓存而不是使用注释(我实际上有很多服务要更改,而不仅仅是一个),有没有好的方法仍然记录这些事件?
关于那个话题的想法。可能前两个最相关:
不要:在Spring中执行的代码和缓存命中时的相应缓存是性能最关键的代码。这就是为什么 let 在这种情况下调用额外的代码,甚至有一个选项都不是那么聪明。在日志中连接会极大地影响您的性能。通常,所有导致缓存请求(例如传入的 Web 请求)的应用程序都已登录。要了解缓存是否正常工作,命中计数器就足够了。这可以通过 JCache JMX 统计信息获得。
日志记录适配器:使用Spring,您可以编写一个缓存适配器,根据需要进行日志记录并通过配置将其连接。大致思路:看一下CacheManager
和Cache
接口。包装 CacheManager
创建缓存方法和 return 带有日志记录的包装缓存。
通过 ExpiryPolicy 进行攻击:当指定自定义 ExpiryPolicy
时,JCache 实现会在每次缓存访问时调用方法 getExpiryForAccess
。但是,您不会获得有关所请求的实际密钥的任何信息。出于性能原因,我还建议远离自己的 ExpiryPolicy
实现。所以这只是为了完整性。
记录缓存/记录每次访问:如果您指定多个缓存,Spring会一个接一个地调用它们。您可以连接一个虚拟缓存作为第一个缓存,它只记录访问。