windows下使用RedisCluster集群简单实例



一、开发环境

1.win7
2.redis  3.0 64位

3.ruby 环境测试用到的所有安装包及我的测试配置 http://pan.baidu.com/s/1qXmO3fQ
redis 安装
   Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定。详情请参考:http://redis.io/download
  Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,官方说明: 
 Win64   Unofficial  The Redis project does not directly supportWindows,   however the Microsoft Open Tech group develops and maintains  an Windows port targeting Win64. 
项目地址:https://github.com/MSOpenTech/redis打开以后,可以直接使用浏览器下载,或者git克隆。在release页面可以下载需要的redis包


Image.png

下载解压,没什么好说的,在解压后的bin目录下有以下这些文件:
redis-benchmark.exe         #基准测试redis-check-aof.exe         # aofredis-check-dump.exe        # dumpredis-cli.exe               # 客户端redis-server.exe            # 服务器redis.windows.conf          # 配置文件
ruby环境准备
下载 64位的 RubyInstaller并安装 地址http://rubyinstaller.org/downloads/勾选下面三个不用配置环境变量

Image.png

安装RubyGems
下载下来是一个压缩包,解压运行里面的 setup.rb 安装 rubyGems由于墙的原因ruby自带的源有时候很慢,我们换成淘宝的源,不然下面安装redis依赖会失败\(--)/
在cmd下运行
gem sources --remove https://rubygems.org/  删掉原来的源gem sources -ahttp://ruby.taobao.org   添加淘宝源gem sources -l 查看现有的源gem install redis  安装redis依赖


(3)安装gem-redis:version(3.0.0)

 

Java代码   收藏代码
  1. gem install redis --version 3.0.0  
  2. #由于源的原因,可能下载失败,就手动下载下来安装  
  3. #download地址:http://rubygems.org/gems/redis/versions/3.0.0  
  4. gem install -l /data/soft/redis-3.0.0.gem  


二 、使用redis cluster
按照文档的说明步骤来做就行了,详情在这 http://doc.redisfans.com/topic/cluster-tutorial.html#id5
要让集群正常运作至少需要三个主节点,因此我们创建6个节点,三个主节点三个从节点,详细请查看文档,我简化一下文档的步骤即:
1.创建 6个文件夹分别为 7000-7005这里就是做集群时各个机器所安装的redis,在每个文件夹放一份下载下来的redis,例如
Image.png

2.创建配置文件  redis.conf其他几个7000-7004文件夹以此类推,注意修改对应的端口号
port 7005cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly 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这台机里
PS:使用前应该对业务做梳理,根据系统中key的特点来调整各个机器的slots范围,不然系统的key基本集中在一两台机器上集群的效果就不大了
redis-trib.rb文件在下载下来的redis包里可能是没有的,可以到https://github.com/antirez/redis/tree/unstable/src 目录下下载之前的ruby环境就是为运行这个文件做准备的
命令的意义如下:
redis-trib.rbcreate, 这表示我们希望创建一个新的集群。选项 --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 bar2get 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
参考资料
redis安装参考  http://blog.csdn.net/renfufei/article/details/38474435
redis集群http://doc.redisfans.com/topic/cluster-tutorial.html#id5
redis命令参考http://doc.redisfans.com/

文/Eric新之助(简书作者)
原文链接:http://www.jianshu.com/p/22af55518f6d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值