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还可以发现几种其他的方式。