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;}
}