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;
    }
}
相关推荐
lang2015092815 分钟前
Spring Boot健康检查全解析
java·spring boot·后端
我是华为OD~HR~栗栗呀1 小时前
华为OD-Java面经-21届考研
java·c++·后端·python·华为od·华为·面试
考虑考虑1 小时前
流收集器
java·后端·java ee
野犬寒鸦3 小时前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
上进小菜猪3 小时前
智能信创新范式:浙江省人民医院的全栈国产化与智能数据底座实践
后端
没有bug.的程序员4 小时前
Spring 常见问题与调试技巧
java·后端·spring·动态代理·1024程序员节
黎燃4 小时前
构筑自主可控医疗生态-数智融合新引擎-医疗全栈信创跃迁
后端
R.lin5 小时前
OSS服务模块-基于数据库配置的Java OSS服务解决方案,支持MinIO、七牛云、阿里云和腾讯云
java·数据库·后端·mysql
R.lin5 小时前
使用 Undertow 替代 Tomcat
java·后端·tomcat
Mintopia5 小时前
🇨🇳 Next.js 在国内场景下的使用分析与实践指南
前端·后端·全栈