zoukankan      html  css  js  c++  java
  • 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还可以发现几种其他的方式。

  • 相关阅读:
    2017年5月24日 HTML 基础知识(二)
    2017年5月22日 HTML基础知识(一)
    尼采语录
    Unicode字符串和整数和浮点数
    转义字符
    python第一节
    C# ASP .NET WEB方向和WPF方向,我该如何去选择
    ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL/SQL Statement ignored 问题
    C# WPF打印报表
    Sql Server 自定义数据类型
  • 原文地址:https://www.cnblogs.com/chansblogs/p/9308876.html
Copyright © 2011-2022 走看看