springboot 定义多个缓存管理器

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;
    }
}
相关推荐
952362 小时前
MyBatis
后端·spring·mybatis
uzong5 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan5 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
小江的记录本5 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab5 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
Daybreak8 小时前
Elasticsearch 里的索引和 Mapping,到底是什么关系?
后端
Lee川8 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
李小狼lee8 小时前
深入浅出sse协议,用代码自己实现
后端