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;
    }
}
相关推荐
evans在进步几秒前
Spring Boot 核心机制详解:可执行 JAR、CORS、静态资源与配置绑定
spring boot·后端·jar
Sayuanni%36 分钟前
SpringBoot 从注解到源码:核心知识点总结
java·spring boot·后端
陈随易1 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
人间凡尔赛2 小时前
2026 后端架构三驾马车:Wasm 容器上 K8s、存算分离与 AI 原生
后端·云原生·架构
m0_587383002 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
mit6.8242 小时前
保持缓存的有效性
缓存
凤山老林2 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
东风破_3 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript
【赫兹威客】浩哥3 小时前
基于SpringBoot+Vue3的健身运动管理系统|WebSocket实时消息 健身房毕设项目
spring boot·websocket·课程设计
凤山老林3 小时前
数据库读写分离与动态路由实战:Spring Boot + ShardingSphere-JDBC 生产配置
数据库·spring boot·后端·分库分表·sharding-jdbc