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中的缓存名称。