springboot配置rediscluster

项目中redis升级,需要集群方案,按照http://www.cnblogs.com/Cratical/p/6811245.html文章中描述搭建集群方案后,后台WEB服务无法正常运行:redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 979 XXX.XX.XXX.XXX:7XX1


搜索一下由文章http://blog.csdn.net/chenyuangege/article/details/51519370中描述的缘故,要用JedisCluster 代替ShardedJedis,由于项目是用springboot,所以专门去找了springboot配置rediscluster的方法。

再次搜索找到一个解决方案http://www.cnblogs.com/m4tech/p/6610144.html,可惜要自己写JedisCluster的实例化@Bean方法,我不喜欢这个解决方案,因为在springboot的配置方案中肯定有默认的JedisCluster实例化方法,只需要设置相关属性即可,于是我开始自己摸索着配置起来了。

可惜spring的官网没有提供好的页面方法,因此只有自己查看spring-redis的源代码找答案

找到org.springframework.data.redis.connection.jedis.JedisConnectionFactory类,在springboot官网给出代码中,默认会装配的redisconnectionfactory为该类:

springboot配置rediscluster_第1张图片

看见JedisConnectionFactory类中有cluster属性和sentinel属性,就是redis的集群配置属性和哨兵配置属性

springboot配置rediscluster_第2张图片

由此可以断定springboot中默认的配置属性一定能支持redisclusterconnection的初始化而不需要去自己写jediscluster实例的初始化

找到org.springframework.boot.autoconfigure.data.redis.RedisProperties,该类含有@ConfigurationProperties标注,redis的cluster就是在这里设置:


找到cluster属性和sentinel属性,发现可以设置,于是将之前springboot中关于redis的设置修改了一番


改前的springboot配置:

springboot配置rediscluster_第3张图片

改后配置


再次运行报错,提示没有认证信息


spring的源码中的提示真是坑爹,password是无论集群还是单机都要输入的于是继续修改

springboot配置rediscluster_第4张图片

再次修改配置文件

springboot配置rediscluster_第5张图片

可以正常启动,但是redis读取的时候又会报错


由此得知,使用了cluster的配置,但是产生的connection又是ShardedJedis,这就非常奇怪了,继续阅读源码才发现这些代码:在org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration中的createJedisConnectionFactory()方法中首先会调用getSentinelConfig(),然后才会调用getClusterConfiguration()方法,就是说springboot中配置的哨兵服务会优先集群方式返回一个ShardedJedis:

springboot配置rediscluster_第6张图片

看完这个代码,就知道如何修改springboot的配置信息,只要把sentinel的配置注释掉就可以了如下:

springboot配置rediscluster_第7张图片

至此springboot正常运行rediscluster

你可能感兴趣的:(springboot配置rediscluster)