一、开发环境

ruby环境准备

下载 64位的 RubyInstaller并安装 地址http://rubyinstaller.org/downloads/
勾选下面三个不用配置环境变量

Image.png

安装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,例如

Image.png

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

Image.png

打印出配置信息,现在的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文件里生成了什么

Paste_Image.png

里面记录了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);
}

Image.png

github上有这一句,Jedis Cluster 会自动去发现集群中的节点,所以JedisClusterNodes只需要 add一个实例

运行得到结果

Image.png

接下来用redis客户端看看这两个key=1417 、key=288的值存到哪个节点下
看回最初的配置

Image.png

key=288算出来的 CRC16校验和是 4258,根据配置 应该存在 7000这台机上
key=1417 算出来的 CRC16校验和是 13096,根据配置 应该存在 7002 这台机上

用redis 客户端查看数据存到哪台机器上

Image.png

进去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集群简单实例的更多相关文章

  1. Windows下 搭建redis集群

    Windows下搭建redis集群教程 一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主 ...

  2. zookeeper在windows下的伪集群模式

    参考:zookeeper在windows下的伪集群模式 踩到的坑: 注意windows下路径需要使用\ dataDir=D:\Program Files\Java\zookeeper-3.4.10-c ...

  3. windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error

    windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error 学习了:https ...

  4. windows下安装redis集群

    前几天在自己在本机win10 电脑下部署了redis集群. 主要通过的是网上两个博客: 如何在windows下部署redis集群:https://blog.csdn.net/zsg88/article ...

  5. Windows下搭建Redis集群

    Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Redis是单线程处理的,多核CPU也只能使用一个核, 所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用 ...

  6. Redis集群搭建(转自一菲聪天的“Windows下搭建Redis集群”)

    配置Redis参考:http://blog.csdn.net/zsg88/article/details/73715947 使用Ruby配置集群参考:https://www.cnblogs.com/t ...

  7. windows下的redis集群搭建的艰辛历程

    我是参照这两篇教程进行的操作:   1.https://www.cnblogs.com/weiqinl/p/6490372.html   (主) 2.https://blog.csdn.net/qiu ...

  8. CentOS 7下 部署Redis-cluster集群

    redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点 ...

  9. kubernetes集群简单实例搭建

    systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...

随机推荐

  1. 数据仓库建模与ETL的实践

    一.Data仓库的架构 Data仓库(Data Warehouse DW)是为了便于多维分析和多角度展现而将Data按特定的模式进行存储所建立起来的关系型Datcbase,它的Data基于OLTP源S ...

  2. STL_容器_删除

    1.erase()函数 用于删除由迭代器指定的元素,或者一个区间. 2.clear()函数 用于删除容器中所有元素 3.remove()函数 用于删除指定的元素,无需知道元素在容器的哪个位置,会删除掉 ...

  3. 增量打包DOC版

    压缩zip的命令有的系统没有的自己去下载一个,否则关闭压缩zip的命令. 有需要的自行更改,这是满足我需求的. 执行 publish.bat 即可,当然需要将文件清单写好放在 resources.tx ...

  4. L219 China's office workers consider further education, training essential

    More than 90 percent of China's office workers consider on-the-job training and continuing education ...

  5. 关于DIY操作系统的断更道歉

    去年9月份正是开学的时候,刚开学没感觉忙.但是随着课程的深入,而且都是专业课,再加上招娉会一个接一个的来,渐渐显得力不从心.由于我对操作系统这一方面也是一知半解,以前也没有系统地学过计算机方面的东西, ...

  6. ios 从网络上获取图片

    -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIImage * result; N ...

  7. ACCESS修改密码,更新显示

    public partial class 修改用户信息frm : Form { public 修改用户信息frm() { InitializeComponent(); } public string ...

  8. influx+grafana自定义python采集数据和一些坑的总结

    先上网卡数据采集脚本,这个基本上是最大的坑,因为一些数据的类型不正确会导致no datapoint的错误,真是令人抓狂,注意其中几个key的值必须是int或者float类型,如果你不慎写成了strin ...

  9. tunning-prime优化mysql建议

    #!/bin/sh       # set tabstop=8   ################################################################## ...

  10. Swift中获取系统语言

    //en-US zh-HK zh-TW zh-Hans-US var lng:String { let userDefault = NSUserDefaults.standardUserDefault ...