windows下使用RedisCluster集群简单实例
一、开发环境
ruby环境准备
下载 64位的 RubyInstaller并安装 地址http://rubyinstaller.org/downloads/
勾选下面三个不用配置环境变量
安装RubyGems
下载下来是一个压缩包,解压运行里面的 setup.rb 安装 rubyGems
由于墙的原因ruby自带的源有时候很慢,我们换成淘宝的源,不然下面安装redis依赖会失败。
在cmd下运行
gem sources --remove https://rubygems.org/ 删掉原来的源
gem sources -a http://ruby.taobao.org 添加淘宝源
gem sources -l 查看现有的源
gem install redis 安装redis依赖
二 、使用redis cluster
要让集群正常运作至少需要三个主节点,因此我们创建6个节点,三个主节点三个从节点,详细请查看文档,我简化一下文档的步骤即:
下载ruby环境下Redis的驱动,考虑到兼容性,这里下载的是3.2.2版本
https://rubygems.org/gems/redis/versions/3.2.2
注意:下载在页面右下角相关连接一项中
安装该驱动,命令如下:
gem install --local path_to_gem/filename.gem
实际操作如下:
2.3.下载Redis官方提供的创建Redis集群的ruby脚本文件redis-trib.rb,路径如下:
https://raw.githubusercontent.com/MSOpenTech/redis/3.0/src/redis-trib.rb
打开该链接如果没有下载,而是打开一个页面,那么将该页面保存为redis-trib.rb,建议保存到Redis的目录下。
1.创建 6个文件夹分别为 7000-7005
这里就是做集群时各个机器所安装的redis,在每个文件夹放一份下载下来的redis,例如
2.创建配置文件 redis.conf
其他几个7000-7004文件夹以此类推,注意修改对应的端口号
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
文件中的
cluster-enabled 选项用于开实例的集群模式,
cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为nodes.conf 。
nodes.conf 节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。
3.创建启动脚本7005.bat
这样不用总是敲命令 ,名字随意改,其他几个文件夹同理
@echo off
redis-server.exe redis.conf
@pause
4.创建集群
1.按照上面所说的配置好各个实例,主要是改端口号,运行 7000.bat- 7005.bat脚本启动六个redis实例
2.cd到 redis-trib.rb 所在的目录下运行命令
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
打印出配置信息,现在的master是 7000 7001 7002这三台机,redis会对key 做 CRC16 校验和后分别存储这三台机上。没问题就输入 yes
例如 7000 这台机 slots:0-5460 的意思是:
对key 做 CRC16 校验和后 值在 0-5460范围内都会存到这台机器里
例如 key=288 对应的CRC16校验和 为 4258,应该存在7000这台机里
注意:使用前应该对业务做梳理,根据系统中key的特点来调整各个机器的slots范围,
不然系统的key基本集中在一两台机器上集群的效果就不大了
redis-trib.rb文件在下载下来的redis包里可能是没有的,可以到
https://github.com/antirez/redis/tree/unstable/src 目录下下载
之前的ruby环境就是为运行这个文件做准备的
命令的意义如下:
redis-trib.rb
create, 这表示我们希望创建一个新的集群。
选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。
简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
看看node.conf文件里生成了什么
里面记录了master 和 slave的对应关系,例如图片里的 7000是master 而对应的 slave是7003这台机,绿色的一长串数字是对应机器的Id,redis以此来标记一台机器。
三、Jedis编程使用集群
github地址 https://github.com/xetorthio/jedis
按上面两步配置好,创建并启动集群。测试代码如下:
添加Jedis依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
测试代码:
@Test
public void cluster(){
String key = "1417";
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.setnx(key, "bar");
String value = jc.get(key);
System.out.println("key-"+key+" slot-"+JedisClusterCRC16.getSlot(key)+" value-"+value);
String key2 = "288";
jc.setnx(key2, "bar2");
String value2 = jc.get(key);
System.out.println("key-"+key2+" slot-"+JedisClusterCRC16.getSlot(key2)+" value-"+value2);
}
github上有这一句,Jedis Cluster 会自动去发现集群中的节点,所以JedisClusterNodes只需要 add一个实例
运行得到结果
接下来用redis客户端看看这两个key=1417 、key=288的值存到哪个节点下
看回最初的配置
key=288算出来的 CRC16校验和是 4258,根据配置 应该存在 7000这台机上
key=1417 算出来的 CRC16校验和是 13096,根据配置 应该存在 7002 这台机上
用redis 客户端查看数据存到哪台机器上
进去7000这台机上
get 288拿到了value bar2
get 1417 得到提示让去 7002这台机查
从redis客户端看到的结果与配置一致
四、简单集成Spring
JedisFactory类
传入host 、port 和JedisPoolConfig 类
package your path;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
/**
* <p>Title: JedisClusterFactory.java</p>
* <p>Description: </p>
* @author qiaowei liu
* @date 2016-1-14
* @version 1.0
*/
public class JedisClusterFactory {
/**
* @Description
* @author qiaowei liu
* @date 2016-1-14 上午11:00:18
* @param args
*/
private JedisCluster jedisCluster;
public JedisCluster getJedisCluster() {
return jedisCluster;
}
public JedisClusterFactory(JedisPoolConfig jedisPoolConfig,String host,int port){
Set<HostAndPort> jedisClusterNodes= new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort(host,port));
jedisCluster=new JedisCluster(jedisClusterNodes,jedisPoolConfig);
}
}
JedisProvide.java工具类,主要是封装些常用的操作
package your path;
import your path.CacheSecondLevel;
import redis.clients.jedis.JedisCluster;
/**
* <p>Title: RedisProvide.java</p>
* <p>Description: </p>
* @author qiaowei liu
* @date 2016-1-8
* @version 1.0
*/
public class RedisProvide implements CacheSecondLevel {
private JedisCluster jedisCluster;
public RedisProvide(JedisClusterFactory jedisClusterFactory){
jedisCluster=jedisClusterFactory.getJedisCluster();
}
@Override
public Object get(String key){
return jedisCluster.get(key);
}
@Override
public Object[] gets(String[] keys) {
// TODO Auto-generated method stub
return null;
}
@Override
public void set(String key, Object obj) {
// TODO Auto-generated method stub
jedisCluster.set(key, obj.toString());
}
@Override
public void delete(String key) {
// TODO Auto-generated method stub
jedisCluster.del(key);
}
}
applicationContext.xml配置
<!--==================== redis配置 start ====================-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="jedisClusterFactory" class="xxx.xxx.JedisClusterFactory" >
<constructor-arg ref ="jedisPoolConfig"/>
<constructor-arg name="host" value="${redis.host}"/>
<constructor-arg name="port" value="${redis.port}"/>
</bean>
<bean id="redisProvide" class="xxx.xxx.RedisProvide">
<constructor-arg ref ="jedisClusterFactory" />
</bean>
<!--==================== redis配置 end ====================-->
conf/perproties
#redis config
redis.host=127.0.0.1
redis.port=7000
redis.timeout=100000
redis.maxIdle=300
redis.maxTotal=600
redis.timeBetweenEvictionRunsMillis=30000
redis.minEvictableIdleTimeMillis=30000
redis.testOnBorrow=true
windows下使用RedisCluster集群简单实例的更多相关文章
- Windows下 搭建redis集群
Windows下搭建redis集群教程 一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主 ...
- zookeeper在windows下的伪集群模式
参考:zookeeper在windows下的伪集群模式 踩到的坑: 注意windows下路径需要使用\ dataDir=D:\Program Files\Java\zookeeper-3.4.10-c ...
- windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error
windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error 学习了:https ...
- windows下安装redis集群
前几天在自己在本机win10 电脑下部署了redis集群. 主要通过的是网上两个博客: 如何在windows下部署redis集群:https://blog.csdn.net/zsg88/article ...
- Windows下搭建Redis集群
Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Redis是单线程处理的,多核CPU也只能使用一个核, 所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用 ...
- Redis集群搭建(转自一菲聪天的“Windows下搭建Redis集群”)
配置Redis参考:http://blog.csdn.net/zsg88/article/details/73715947 使用Ruby配置集群参考:https://www.cnblogs.com/t ...
- windows下的redis集群搭建的艰辛历程
我是参照这两篇教程进行的操作: 1.https://www.cnblogs.com/weiqinl/p/6490372.html (主) 2.https://blog.csdn.net/qiu ...
- CentOS 7下 部署Redis-cluster集群
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点 ...
- kubernetes集群简单实例搭建
systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...
随机推荐
- re 正则
如果直接给出字符,就是精确匹配.对于特殊字符- ,在正则表达式中要用转义字符\转义. \d 一个数字, \w 任意单个字符,空白符除外(例 字母.数字或下划线 . 英 ...
- HP-UNIX操作系统root账号被锁定的两种解决方法
方法一:到单用户取消trusted system, 重新激活账户 a.重起机器,自检完成后,会出现这一行"To discontinue, press any key in 10 second ...
- 关于c++显示调用析构函数的陷阱
版权声明:欢迎转载,注明出处就好!如果不喜欢请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步!! 目录(?)[+] 一.文章来由 现在在写一个项目,需要用到多叉树存储结构,但是在某个时候 ...
- SharePoint Foundation 搜索-PowerShell
1. 显示搜索服务信息 Get-SPSearchService 2. 显示搜索服务实例 Get-SPSearchServiceInstance 3. 获取指定搜索服务实例 $ssInstance = ...
- 关于Behold the Kickmen (球员登场)
音乐:『Boring,Boring——』作者浑厚的男中音响起,伴随着劲爆的动感音乐 非同正式却又无伤大雅的规则:足球场是圆形的,而且四周有反弹围墙 加强操作的一些设定: 踢踢人射门蓄力时,时间会静止, ...
- HRBUST单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- A+B for Input-Output Practice (VIII)
A+B for Input-Output Practice (VIII) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- file.replace
一.简介 salt file.replace 文件内容处理函数,类似于ansible的lineinfile模块 二.参数介绍 name 被编辑文件的绝对路径,支持软链接 pattern 常规表达式,使 ...
- iOS-----使用CFNetwork实现TCP协议的通信
使用CFNetwork实现TCP协议的通信 TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个通信接口,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以 ...
- LIBCURL踩坑记
这里一个java程序员进行C++开发使用libcurl踩过的坑: 1. 发送指定请求类型body,比较通用方法如下,可以直接填写数据并手动指定content type,如果是form表单等形式,则需 ...