说明:无论是否已经搭建好集群,还是使用什么样的客户端去连接,都是必须把全部IP列表集成进去,然后随机往其中一个IP写。

这样做的好处:

1、随机IP写入之后,Redis Cluster代理层会自动根据分片写入其中一台,随机IP只是减缓一个IP时的巨大流量问题。

2、对于写死的IP问题,可以通过动态配置文件或者接口,观察IP更新或者节点增加时,重新实例化,原有业务不影响,因为对象本身到GC时也代表当前业务已经完成。

下面是基于Spring和Jedis实现的集群,同时后端采用就是Redis Cluster原生集群。

当然,也可以自己手写这些客户端等。

原理还待研究,到底是不是只要写上了这些IP,客户端就全部保持着这些连接,然后有助于判断哪个不可用。

还有一种想法是通过HAProxy来聚合出一个IP,然后将这些IP都添加进去,不过没测试过这种方式对Redis Cluster模式会不会有影响。

我猜测客户端需要全部IP都写上,是由于其支持-MOVED 6918 127.0.0.1:7004这样的命令,去取数据。应该是客户端实现了这些协议。

而如果是基于Redis Cluster模式的,我猜测应该不能再前面使用HAProxy的代理去聚合IP。

关于这种模式的理解,参考:http://www.searu.org/30194.html,说到:当集群处于稳定状态时,所有客户端最终都会保存有一个哈希槽至节点的映射记录,使得集群非常高效: 客户端可以直接向正确的节点发送命令请求, 无须转向、代理或者其他任何可能发生单点故障(single point failure)的实体(entiy)。

这种应该就是不用代理软件去实现的原因。

下面是基于Spring+Jedis的配置:

在Spring配置文件中添加Jedis配置。(三主三从,9001-9003是主,9004-9006是从)

  1. <!-- 配置redis客户端集群版 -->
  2. <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
  3. <constructor-arg>
  4. <set>
  5. <bean class="redis.clients.jedis.HostAndPort">
  6. <constructor-arg name="host" value="192.168.XX.XX"/>
  7. <constructor-arg name="port" value="9001"/>
  8. </bean>
  9. <bean class="redis.clients.jedis.HostAndPort">
  10. <constructor-arg name="host" value="XXXXXXX"/>
  11. <constructor-arg name="port" value="9002"/>
  12. </bean>
  13. <bean class="redis.clients.jedis.HostAndPort">
  14. <constructor-arg name="host" value="XXXXXXX"/>
  15. <constructor-arg name="port" value="9003"/>
  16. </bean>
  17. <bean class="redis.clients.jedis.HostAndPort">
  18. <constructor-arg name="host" value="XXXXXXX"/>
  19. <constructor-arg name="port" value="9004"/>
  20. </bean>
  21. <bean class="redis.clients.jedis.HostAndPort">
  22. <constructor-arg name="host" value="XXXXXXX"/>
  23. <constructor-arg name="port" value="9005"/>
  24. </bean>
  25. <bean class="redis.clients.jedis.HostAndPort">
  26. <constructor-arg name="host" value="XXXXXXX"/>
  27. <constructor-arg name="port" value="9006"/>
  28. </bean>
  29. </set>
  30. </constructor-arg>
  31. </bean>
  32.  
  33. <bean id="jedisClientCluster" class="com.dianshang.rest.component.impl.JedisClientCluster"/>

封装Redis的一些常用操作(存储String 类型,获取String类型,设置过期时间,删除hash数据等等)

  1. /**
  2. * redis操作工具类
  3. * @author xiao
  4. *
  5. */
  6. public class JedisClientCluster implements JedisClient{
  7.  
  8. //注入jedisCluster
  9. @Autowired
  10. private JedisCluster jedisCluster;
  11.  
  12. /**
  13. * 设置String数据类型
  14. *
  15. * @param key
  16. * @param value
  17. * @return
  18. */
  19. @Override
  20. public String set(String key, String value) {
  21. return jedisCluster.set(key, value);
  22. }
  23.  
  24. /**
  25. * 获取String数据类型
  26. *
  27. * @param key
  28. * @return
  29. */
  30. @Override
  31. public String get(String key) {
  32. return jedisCluster.get(key);
  33. }
  34.  
  35. /**
  36. * 设置hash数据类型
  37. *
  38. * @param key
  39. * @param item
  40. * @param value
  41. * @return
  42. */
  43. @Override
  44. public Long hset(String key, String item, String value) {
  45. return jedisCluster.hset(key, item, value);
  46. }
  47.  
  48. /**
  49. * 获取hash数据类型
  50. *
  51. * @param key
  52. * @param item
  53. * @return
  54. */
  55. @Override
  56. public String hget(String key, String item) {
  57. return jedisCluster.hget(key, item);
  58. }
  59.  
  60. /**
  61. * 删除hash数据
  62. * @param key
  63. * @param item
  64. * @return
  65. */
  66. @Override
  67. public Long incr(String key) {
  68. return jedisCluster.incr(key);
  69. }
  70.  
  71. /**
  72. * 加一操作
  73. *
  74. * @param key
  75. * @return
  76. */
  77. @Override
  78. public Long decr(String key) {
  79. return jedisCluster.decr(key);
  80. }
  81.  
  82. /**
  83. * 减一操作
  84. *
  85. * @param key
  86. * @return
  87. */
  88. @Override
  89. public Long expire(String key, int second) {
  90. return jedisCluster.expire(key, second);
  91. }
  92.  
  93. /**
  94. * 设置key的过期时间
  95. *
  96. * @param key
  97. * @param second
  98. * @return
  99. */
  100. @Override
  101. public Long ttl(String key) {
  102. return jedisCluster.ttl(key);
  103. }
  104.  
  105. /**
  106. * 判断key是否过期
  107. *
  108. * @param key
  109. * @return
  110. */
  111. @Override
  112. public Long hdel(String key, String item) {
  113. return jedisCluster.hdel(key, item);
  114. }
  115.  
  116. }

测试:

  1. @Test
  2. public void testJedisClientSpring() throws Exception {
  3. //创建一个spring容器
  4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
  5. //从容器中获得JedisClient对象
  6. JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
  7. //jedisClient操作redis
  8. jedisClient.set("cliet1", "1000");
  9. String string = jedisClient.get("cliet1");
  10. System.out.println(string);
  11. }

参考:

http://blog.csdn.net/u010539352/article/details/51778242(以上内容部分转自此篇文章)

http://blog.csdn.net/younger_z/article/details/51366791

http://m635674608.iteye.com/blog/2292236

https://www.2cto.com/kf/201609/551965.html

http://www.sojson.com/blog/203.html

Redis Cluster集群搭建后,客户端的连接研究(Spring/Jedis)(待实践)的更多相关文章

  1. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  2. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  3. Redis Cluster集群搭建<原>

    一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标     Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...

  4. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)

    前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...

  5. 【Redis】Redis cluster集群搭建

    Redis集群基本介绍 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation. Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行 ...

  6. centos8平台redis cluster集群搭建(redis5.0.7)

    一,规划 redis cluster 1,cluster采用六台redis,3主3从 redis1    : ip: 172.17.0.2 redis2    : ip: 172.17.0.3 red ...

  7. Redis Cluster 集群搭建与扩容、缩容

    说明:仍然是伪集群,所有的Redis节点,都在一个服务器上,采用不同配置文件,不同端口的形式实现 前提:已经安装好了Redis,本文的redis的版本是redis-6.2.3 Redis的下载.安装参 ...

  8. Ubuntu 16.04 下Redis Cluster集群搭建

    实际操作如下: 准备工作 版本:4.0.2 下载地址:https://redis.io/download 离线版本:(链接: https://pan.baidu.com/s/1bpwDtOr 密码: ...

  9. redis cluster 集群搭建步骤和注意事项

    1.安装Ubuntu ,修改root的密码. sudo passwd  (apt-get update 更新系统) 2.安装 Gcc 和G++  sudo apt-get install build- ...

随机推荐

  1. SharedPrefences的用处

    存储数据 SharedPreferences.Editor edit = getSharedPreferences("data", MODE_PRIVATE).edit(); ed ...

  2. asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中

    1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", " ...

  3. laravel的socialite微信登录之用户信息

    要想获取完整的用户信息如下 { , "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname" ...

  4. hibernate 批量抓取

    使用场景: 是查询出来一个集合,然后又查询每个集合对象中的集合.使用set标签中的batch-size属性实现. 数据库中只有5个区道信息: 设置batch-size=”5”,执行的查询语句如下: 而 ...

  5. 今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐。最后找到问题所在doctype

    今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐.最后找到问题所在doctype <-- 这个小箭头

  6. atom 安装插件列表

    插件列表 atom-beautify docblockr autocomplete-python goto-definition platformio-ide-terminal symbols-tre ...

  7. 闲着无聊 一个python的,三级菜单。装逼版。

    menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': ...

  8. python 列表(二)

     列表的其他操作 count 用于统计列表中某个元素出现的次数 Eg: extend 把一个列表添加到另一个列表里面 Index 输出元素的位置即根据内容索引位置 Reverse 把列表元素的位置倒过 ...

  9. Uva 4916 Selling Cells(随机算法)

    题意: 给定n个圆的 坐标 和半径, 求第一个圆与其他圆相交的面积占第一个圆的面积的多大. 分析: 如果从局部去想, 处理每个圆之间的关系, 求出他们与第一个圆的交集, 这样可能就会十分复杂了. 不妨 ...

  10. ELK搭建过程中出现的问题与解决方法汇总

    搭建过程中出现的问题 elasticsearch启动过程中报错[1] ERROR: [1] bootstrap checks failed [1]: the default discovery set ...