使用 Caffeine 在 SpringBoot 中进行缓存

问题描述 投票:0回答:1

我有这个配置文件:

@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(..
        
    }

但我总是在控制台中看到一个选择查询

spring-boot caching cache-control caffeine-cache
1个回答
0
投票

如果每次调用

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(..);
}
© www.soinside.com 2019 - 2024. All rights reserved.