Spring Data Redis 2.x 中 RedisConfiguration 类的新编写方法

Posted 陈先生的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data Redis 2.x 中 RedisConfiguration 类的新编写方法相关的知识,希望对你有一定的参考价值。

在 Spring Data Redis 1.x 的时候,我们可能会在项目中编写这样一个RedisConfig类:

@Configuration
@EnableCaching
public class RedisConfig {
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Bean(name = "redisTemplate")
    public RedisTemplate initRedisTemplate() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        // 最大空闲数
        poolConfig.setMaxIdle(50);
        // 最大连接数
        poolConfig.setMaxTotal(100);
        // 最大等待毫秒数
        poolConfig.setMaxWaitMillis(20000);
        // 创建Jedis连接工厂
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
        connectionFactory.setHostName("localhost");
        connectionFactory.setPort(6379);
        // 调用后初始化方法,没有它将抛出异常
        connectionFactory.afterPropertiesSet();
        // 自定义Redis序列化器
        RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 定义RedisTemplate,并设置连接工程
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 设置序列化器
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
        return redisTemplate;
    }
    
    @SuppressWarnings("rawtypes")
    @Bean(name = "redisCacheManager")
    public CacheManager initRedisCacheManager(@Autowired RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        // 设置超时时间为10分钟,单位为秒
        cacheManager.setDefaultExpiration(600);
        // 设置缓存名称
        List<String> cacheNames = new ArrayList<>();
        cacheNames.add("redisCacheManager");
        cacheManager.setCacheNames(cacheNames);
        return cacheManager;
    }
    
}

 

但是在Spring Data Redis 2.x 以后,我们继续这么编写可能会报如下错误:

 

可见 2.x 以后这些大家常用的配置类的API都得到了一定程度的变动,在发现此问题后笔者一度想通过度娘来找到2.x的新写法,但是没有搜到太好的解决方案,于是自己改用了谷歌,发现也没有太完好的解决方案,最后只好通过之前搜到的一些零散要点,以及自己观看新的源码,摸索着得到了以下可行的新写法

/**
 * Redis 配置.
 *
 * @author chenxinyu
 */
@Configuration
@EnableCaching
public class RedisConfig {

    /**
     * 从application.yml取得redis的host地址.
     */
    @Value("${spring.redis.host}")
    private String redisHost;

    /**
     * 从application.yml取得redis的端口号.
     */
    @Value("${spring.redis.port}")
    private Integer redisPort;

    /**
     * Jedis 连接工厂.
     *
     * @return 配置好的Jedis连接工厂
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration =
                new RedisStandaloneConfiguration(redisHost, redisPort);
        return new JedisConnectionFactory(configuration);
    }

    @Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        /*
         * Redis 序列化器.
         *
         * RedisTemplate 默认的系列化类是 JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的话,
         * 被序列化的对象必须实现Serializable接口。在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读。
         *
         * Jackson2JsonRedisSerializer 和 GenericJackson2JsonRedisSerializer,两者都能系列化成 json,
         * 但是后者会在 json 中加入 @class 属性,类的全路径包名,方便反系列化。前者如果存放了 List 则在反系列化的时候如果没指定
         * TypeReference 则会报错 java.util.LinkedHashMap cannot be cast to
         */
        RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // 定义RedisTemplate,并设置连接工程
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        // key 的序列化采用 StringRedisSerializer
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value 值的序列化采用 GenericJackson2JsonRedisSerializer
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        // 设置连接工厂
        redisTemplate.setConnectionFactory(factory);

        return redisTemplate;
    }

    @Bean
    public CacheManager initRedisCacheManager(RedisConnectionFactory factory) {
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
                .RedisCacheManagerBuilder.fromConnectionFactory(factory);
        return builder.build();
    }

}

 

该方法经笔者测试可用。

当然不止这一种方法,可以看新的 `CacheManager` 中的API还可以发现几种其他的方式。

 

以上是关于Spring Data Redis 2.x 中 RedisConfiguration 类的新编写方法的主要内容,如果未能解决你的问题,请参考以下文章

springboot 2.x整合redis,spring aop实现接口缓存

如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?

spring-session-data-redis反序列化问题

Spring Boot 2.X:Spring Boot 集成 Redis

Spring之Redis访问(Spring-data-redis)

spring-data-redis 使用过程中踩过的坑