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;
    }
}
相关推荐
小科先生33 分钟前
Java springboot调用数据库的基本流程
java·数据库·spring boot
时间的拾荒人2 小时前
Redis 集合类型详解:Set 与 Zset
redis·缓存·面试
一条Go3 小时前
OnCall 时段路由:跨午夜、左闭右开与「Local 不是时区」
后端·架构·github
Moment3 小时前
不会后期的我,发现了一个开源胶片神器😍😍😍
前端·后端·开源
数据库小学妹3 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
三小河4 小时前
SWC 凭什么比 Babel 快 ?项目优化迁移踩坑记录
前端·后端
鶴哥只手遮天4 小时前
《Redis 8.10.3 深度剖析》系列 ·第 17 章. 一个迟到十六年的类型
redis·后端·开源
知守观4 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
Anymous5 小时前
我手写的 Redis 锁,输给了 10 秒的 TTL
后端·架构
Rain的Java大神之路5 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试