使用redis缓存,并兼容SpringCahce

62 阅读1分钟

使用redis缓存,并兼容SpringCahce

一、配置文件


import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
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.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.util.CollectionUtils;

import java.time.Duration;

/***
 * caffeine 配置
 * @author ZiYao Lee
 * @date 2022/11/23
 */
@Configuration
@EnableCaching
@Slf4j
public class RedisCacheConfig extends CachingConfigurerSupport {
    @Bean
    @Primary
    @Override   //继承上面这个类,并且加上这个之后才能把它设置为默认的。
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> {
            String re= String.format("%s::%s(%s)",target.getClass().getName(),method.getName(),
                    CollectionUtils.arrayToList(params));//Arrays.asList(params)
            log.debug("缓存生成的key:{}。",re);
            return re;
        };
    }


//    /**
//     * 配置RedisTemplate的序列化方式
//     */
//    @Bean
//    public RedisTemplate<String, Object> RedisTemplate(RedisConnectionFactory factory) {
//        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(factory);
//        // 指定key的序列化方式:string
//        redisTemplate.setKeySerializer(RedisSerializer.string());
//        // 指定value的序列化方式:json
//        redisTemplate.setValueSerializer(RedisSerializer.json());
//        return redisTemplate;
//    }

    @Primary
    @Bean(name = "cacheManager")
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration cacheConfiguration =
                RedisCacheConfiguration.defaultCacheConfig()
                        .disableCachingNullValues()
                        .entryTtl(Duration.ofMinutes(5))
                        .serializeValuesWith(
                                RedisSerializationContext.SerializationPair.fromSerializer(
                                        RedisSerializer.json()));

        return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(factory), cacheConfiguration);
//        return RedisCacheManager.builder(factory)
//                .cacheDefaults(cacheConfiguration)
//                .build();
    }

    @Bean(name = "specCacheManager")
    public CacheManager specCacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration cacheConfiguration =
                RedisCacheConfiguration.defaultCacheConfig()
                        .disableCachingNullValues()
                        .entryTtl(Duration.ofMinutes(60))
                        .serializeValuesWith(
                                RedisSerializationContext.SerializationPair.fromSerializer(
                                        RedisSerializer.json()));
//        return RedisCacheManager.builder(factory)
//                .cacheDefaults(cacheConfiguration)
//                .build();
        return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(factory), cacheConfiguration);
    }
}

二、配置时间MyRedisCacheManager,使用#就可以自己控制秒数


import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;

import java.time.Duration;

/**
 * @author 李子耀
 * @version 1.0.0
 * @className MyRedisCacheManager
 * @description MyRedisCacheManager
 */
public class MyRedisCacheManager extends RedisCacheManager {
    public MyRedisCacheManager(RedisCacheWriter writer, RedisCacheConfiguration defaultCacheConfiguration) {
        super(writer,defaultCacheConfiguration);
    }
    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        if(!StringUtils.isEmpty(name) && name.contains("#")) {
            String numStr = name.split("#")[1];
            if(StringUtils.isNumeric(numStr)) {
                return super.createRedisCache(name, cacheConfig.entryTtl(Duration.ofSeconds(Integer.parseInt(numStr))));
            }
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

三、配置RedisTemplate

    /**
     * 配置RedisTemplate的序列化方式
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        // 指定key的序列化方式:string
        redisTemplate.setKeySerializer(RedisSerializer.string());
        // 指定value的序列化方式:json
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }

四、使用

image-20231020092726257