说明:无论是否已经搭建好集群,还是使用什么样的客户端去连接,都是必须把全部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是从)

    <!-- 配置redis客户端集群版 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.XX.XX"/>
<constructor-arg name="port" value="9001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="XXXXXXX"/>
<constructor-arg name="port" value="9002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="XXXXXXX"/>
<constructor-arg name="port" value="9003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="XXXXXXX"/>
<constructor-arg name="port" value="9004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="XXXXXXX"/>
<constructor-arg name="port" value="9005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="XXXXXXX"/>
<constructor-arg name="port" value="9006"/>
</bean>
</set>
</constructor-arg>
</bean> <bean id="jedisClientCluster" class="com.dianshang.rest.component.impl.JedisClientCluster"/>

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

/**
* redis操作工具类
* @author xiao
*
*/
public class JedisClientCluster implements JedisClient{ //注入jedisCluster
@Autowired
private JedisCluster jedisCluster; /**
* 设置String数据类型
*
* @param key
* @param value
* @return
*/
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
} /**
* 获取String数据类型
*
* @param key
* @return
*/
@Override
public String get(String key) {
return jedisCluster.get(key);
} /**
* 设置hash数据类型
*
* @param key
* @param item
* @param value
* @return
*/
@Override
public Long hset(String key, String item, String value) {
return jedisCluster.hset(key, item, value);
} /**
* 获取hash数据类型
*
* @param key
* @param item
* @return
*/
@Override
public String hget(String key, String item) {
return jedisCluster.hget(key, item);
} /**
* 删除hash数据
* @param key
* @param item
* @return
*/
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
} /**
* 加一操作
*
* @param key
* @return
*/
@Override
public Long decr(String key) {
return jedisCluster.decr(key);
} /**
* 减一操作
*
* @param key
* @return
*/
@Override
public Long expire(String key, int second) {
return jedisCluster.expire(key, second);
} /**
* 设置key的过期时间
*
* @param key
* @param second
* @return
*/
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
} /**
* 判断key是否过期
*
* @param key
* @return
*/
@Override
public Long hdel(String key, String item) {
return jedisCluster.hdel(key, item);
} }

测试:

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

参考:

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. 如何参与一个GitHub开源项目?

    如何参与一个GitHub开源项目? 摘要:本文是Github官如何参与一个GitHub开源项目方给出的参与Github上开源项目的一些指导,对希望加入开源社区的开发者是一个不错的参考. 最近一年开源项 ...

  2. [Windows Server 2008] 搭建数据云备份

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:如何搭建数 ...

  3. 洛谷 P2341 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  4. React和webpack解决 waiting for roots to load...to reload the inspector

    使用chrome调试工具,react-devtools总是显示 "waiting for roots to load...to reload the inspector" and ...

  5. 安装钩子 SetWindowsHookE

    SetWindowsHookEx 函数将应用程序定义的钩子安装到一个钩链.要将安装一个钩子来监测系统的某些类型的事件.这些事件是与特定的线程或所有线程中调用线程作为同一桌面相关联. Syntax HH ...

  6. java正则表达式的进阶使用20180912

    package org.jimmy.autosearch20180821.test; import java.util.regex.Matcher; import java.util.regex.Pa ...

  7. 零基础入门学习Python(11)--列表:一个打了激素的数组(2)

    前言 上节课我们介绍一个打了激素的数组,叫做列表.列表我们比作一个大仓库,你所能够具现化的东西,都可以往里面扔,它包罗万象.另外还介绍了三个往列表添加元素的方法,分别是: append(),exten ...

  8. 【Mysql数据库】学习笔记

    一.数据库的创建 create database database_name  DEFAULT CHARACTER SET utf8; //创建一个数据库 drop database database ...

  9. layuiAdmin 项目修改

    layuiAdmin修改 index.js 修改登录url user/login=>publics/login config.js 修改 name 项目名称, tokenName token字段 ...

  10. Python之机器学习-波斯顿房价预测

    目录 波士顿房价预测 导入模块 获取数据 打印数据 特征选择 散点图矩阵 关联矩阵 训练模型 可视化 波士顿房价预测 导入模块 import pandas as pd import numpy as ...