Spring Boot项目中集成CacheManager、Caffeine和Redis作为一级缓存和二级缓存

1,448 阅读1分钟

1. 添加Redis和Caffeine依赖

在项目的pom.xml文件中添加Redis和Caffeine依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.0.4</version>
</dependency>

2. 配置Caffeine和Redis CacheManager

在Spring Boot的配置文件中,添加以下配置:

# Caffeine CacheManager
spring.cache.type=caffeine
spring.cache.cache-names=cacheName1
spring.cache.caffeine.spec=maximumSize=100,expireAfterAccess=5m

# Redis CacheManager
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
spring.redis.timeout=60000
spring.cache.redis.time-to-live=3600
spring.cache.redis.cache-null-values=false
spring.cache.redis.use-key-prefix=true
spring.cache.redis.key-prefix=cacheName2
spring.cache.redis.cache-names=cacheName2

上述配置中,首先配置了使用Caffeine作为一级缓存的CacheManager,然后配置了使用Redis作为二级缓存的CacheManager。

3. 配置CacheManager的层次结构

在代码中,需要配置Caffeine CacheManager作为Redis CacheManager的一级缓存,例如:

@Configuration
@EnableCaching
public class CacheConfiguration {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public CacheManager cacheManager() {
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)))
                .build();

        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager("cacheName1");
        caffeineCacheManager.setCaffeine(Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfterAccess(5, TimeUnit.MINUTES)
                .build());

        CompositeCacheManager cacheManager = new CompositeCacheManager(redisCacheManager, caffeineCacheManager);
        cacheManager.setFallbackToNoOpCache(false);
        return cacheManager;
    }
}

上述代码中,首先创建了Redis CacheManager,然后创建了Caffeine CacheManager,并将其作为Redis CacheManager的一级缓存。最后将Redis CacheManager和Caffeine CacheManager组合成一个CompositeCacheManager。

4. 在代码中使用缓存

在需要使用缓存的地方,使用@Cacheable注解指定缓存的名称,例如:

@Service
public class MyService {
 
    @Cacheable(value = {"cacheName1", "cacheName2"})
    public String getFromCache(String key) {
        // ...
    }
}

上述代码中,使用@Cacheable注解指定了缓存的名称为cacheName1和cacheName2,其中cacheName1为Caffeine CacheManager中的缓存名称,cacheName2为Redis CacheManager中的缓存名称。