java
package com.kongjs.note.admin.config;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.cache2k.extra.spring.SpringCache2kCacheManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.support.CompositeCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
@EnableCaching
@Configuration
public class CacheConfig {
@Primary
@Bean("localCacheManager")
public CacheManager localCacheManager() {
SpringCache2kCacheManager cacheManager = new SpringCache2kCacheManager();
cacheManager.defaultSetup(cache2kBuilder -> cache2kBuilder.expireAfterWrite(Duration.ofDays(1L)));
cacheManager.setDefaultCacheNames("user","accessToken","refreshToken");
cacheManager.setAllowUnknownCache(false);
return cacheManager;
}
@Bean("remoteCacheManager")
public CacheManager remoteCacheManager(RedisConnectionFactory connectionFactory) {
GenericJackson2JsonRedisSerializer jsonRedisSerializer = GenericJackson2JsonRedisSerializer.builder().build();
jsonRedisSerializer.configure(objectMapper -> objectMapper.registerModule(new JavaTimeModule()));
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeKeysWith(RedisSerializationContext.string().getKeySerializationPair());
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer));
config = config.entryTtl(Duration.ofDays(1L)).enableTimeToIdle();
config = config.computePrefixWith(cacheName -> "cache:"+cacheName + ":");
config = config.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory).transactionAware().cacheDefaults(config).build();
}
@Bean("levelCacheManager")
public CacheManager levelCacheManager(@Qualifier("localCacheManager") CacheManager localCacheManager, @Qualifier("remoteCacheManager") CacheManager remoteCacheManager) {
List<CacheManager> cacheManagers = new ArrayList<>();
cacheManagers.add(localCacheManager);
cacheManagers.add(remoteCacheManager);
CompositeCacheManager compositeCacheManager = new CompositeCacheManager();
compositeCacheManager.setCacheManagers(cacheManagers);
compositeCacheManager.setFallbackToNoOpCache(true);
return compositeCacheManager;
}
}