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();
    }

}
此方法經測試可用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章