我有这个配置文件:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
@Primary
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("dogsInHouse");
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(200)
.expireAfterAccess(Duration.ofDays(30))
.maximumSize(500));
return cacheManager;
}
}
在属性文件中:
spring.jpa.show-sql=true
服务中:
@Service
@Transactional(readOnly = true)
@Slf4j
@CacheConfig(cacheNames = {"dogsInHouse"})
public class DogsInHouseService {
@Cacheable("dogsInHouse")
public DogsInHouse findDogHouseEnFromDB (String key) {
return dogsEnRepository.findByNameAndLangIs(..
}
但我总是在控制台中看到一个选择查询
如果每次调用
findDogHouseEnFromDB()
方法时都在控制台中看到选择查询,则意味着缓存可能无法按预期工作。
阅读 Lokesh Gupta 中的“Caffeine Cache with Spring Boot”后,出于调试目的,您可以添加一个端点或方法来检查缓存的内容,以确保条目按预期被缓存和逐出。
@GetMapping(value = "/inspectCache")
public void inspectCache() {
CaffeineCache caffeineCache = (CaffeineCache) cacheManager.getCache("dogsInHouse");
Cache<Object, Object> nativeCache = caffeineCache.getNativeCache();
for (Map.Entry<Object, Object> entry : nativeCache.asMap().entrySet()) {
System.out.println("Key = " + entry.getKey());
System.out.println("Value = " + entry.getValue());
}
}
注意:您可以将部分或全部配置移动到
application.properties
文件中,而不是在 Java 配置文件中配置缓存属性。这可以简化配置并使其更易于管理。请参阅JVM语言的配置库
spring.cache.cache-names=dogsInHouse
spring.cache.caffeine.spec=initialCapacity=200,maximumSize=500,expireAfterAccess=720h
如果需要自定义缓存键生成,您可以考虑实现 custom
KeyGenerator
或使用 key
注释上的 @Cacheable
属性来指定如何生成缓存键。
@Cacheable(value = "dogsInHouse", key = "#key")
public DogsInHouse findDogHouseEnFromDB (String key) {
return dogsEnRepository.findByNameAndLangIs(..);
}