在 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(); } }此方法經測試可用。