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

最新文章

  1. 【java开发】方法重写和方法重载概述
  2. zookeeper源码分析二FASTLEADER选举算法
  3. 5.3 Static
  4. Android ImageView的scaletype属性
  5. openstack shelve/unshelve/stop浅析
  6. 【心得】Lattice后端使用经验小结(ECP5UM,DDR3,Diamond3.10,Reveal逻辑分析)
  7. mysql的in和not in的用法(特别注意not in结果集中不能有null)
  8. tomcat9 性能调优
  9. DevExpress v18.1新版亮点——ASP.NET Bootstrap篇(二)
  10. 14- Servlet.service() for servlet [mvc-dispatcher] in context with path [/collegeservice] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root caus
  11. 【转】Java对日期Date类进行加减运算,年份加减,月份加减
  12. linux swap交换分区说明/管理
  13. ubuntu - 安装sqoop
  14. mysql基础 日期类型
  15. 【Linux】- 获取root权限命令
  16. TCP/IP协议详解笔记——IP协议
  17. 李振杰:火狐Mozilla被黑事件的启发
  18. erlang取列表中某个值的位置
  19. UVa 10213 How Many Pieces of Land ? (计算几何+大数)
  20. Android进入一个新页面,EditText失去焦点并禁止弹出键盘

热门文章

  1. nginx 隐藏index.php 并开启rewrite日志调试(apache也有)
  2. fastjson用法&amp;Gson
  3. Drupal 7.31 SQL Injection Exp
  4. Microsoft SQL Server 2008 R2
  5. js/jquery循环提取table单元格值
  6. Key-Value Observing (键值监測)
  7. python连接mysql并插入数据(自用)
  8. .Net 下未捕获异常的处理
  9. mui.ajax返回type为abort
  10. Kubernetes使用prometheus+grafana做一个简单的监控方案