zoukankan      html  css  js  c++  java
  • redis 学习笔记(3)-master/slave(主/从模式)

    类似mysql的master-slave模式一样,redis的master-slave可以提升系统的可用性,master节点写入cache后,会自动同步到slave上。

    环境:

    master node: 10.6.144.155:7030

    slave node: 10.6.144.156:7031

    一、配置

    仅需要在slave node上修改配置:

    找到slaveof这行,参考下面的修改(填上master node的Ip和端口就完事了)

    slaveof 10.6.144.155 7030

    另外注意下 slave-read-only yes 这行,这表示slave只读不写,也是推荐设置

    二、验证

    启动master/slave这二台机器上的redis,在master上加一个缓存项

    然后在slave上取出该缓存项

    取到了,说明master上的cache自动复制到slave节点了

    三、redisson客户端使用

     1     @Test
     2     public void testRedisson() {
     3         Config config = new Config();
     4 
     5         config.useMasterSlaveConnection().setMasterAddress("10.6.144.155:7030")
     6                 .addSlaveAddress("10.6.144.156:7031");
     7 
     8         Redisson redisson = Redisson.create(config);
     9 
    10         String key = "test";
    11         
    12         RBucket<String> myObj = redisson.getBucket(key);
    13         if (myObj!=null){
    14             myObj.delete();
    15         }
    16         
    17         myObj.set("hello World");
    18         
    19         System.out.println(myObj.get());//断点停在这里,然后down掉master,不影响读取
    20         
    21         myObj.set("new Value");//恢复master,down掉slave,不影响写入
    22         
    23         System.out.println(myObj.get());//再恢复slave,down掉master,可正常读取
    24         
    25         myObj.set("can not write to master");//master已down掉,无法写入
    26         
    27         System.out.println(myObj.get());//恢复master,down掉slave,无法读取
    28         
    29         
    30         redisson.shutdown();
    31         
    32         
    33     }
    View Code

    注:经实际测试,redisson客户端在set写操作时,连接的是master node,get读操作时连接的是slave,而且遇到操作失败,会同步阻塞后面的处理(一直等待,直到超时)

    即:set操作时,至少要有一台可连接的master,get操作时,至少要有一台可连接的slave

    四、Jedis客户端使用

     1     @Test
     2     public void testJedis() throws InterruptedException {
     3         
     4         Jedis jedisMaster = new Jedis("10.6.144.155", 7030);
     5         
     6         String key = "a";
     7         
     8         String a= jedisMaster.get(key);
     9         if (a!=null){
    10             jedisMaster.del(key);
    11         }
    12         jedisMaster.set(key, "hi!");//向master写入
    13         jedisMaster.close();
    14         
    15 
    16         Jedis jedisSlave = new Jedis("10.6.144.156", 7031);// 连接slave
    17         
    18         jedisSlave.slaveof("10.6.144.155", 7030);// 指定master        
    19 
    20         System.out.println(jedisSlave.get(key));
    21         
    22         jedisSlave.slaveofNoOne();//master如果down挂,可以用代码将slave提升为master(即:可写)
    23 
    24         jedisSlave.set(key, "new");
    25 
    26         System.out.println(jedisSlave.get(key));
    27 
    28         jedisSlave.close();
    29 
    30     }
    View Code

    后记:个人感觉master-slave模式作用有限,因为从二种client的测试结果看,在没有其它监控机制的前提下,无论是master或slave挂掉,都需要手动调整配置或修改代码,才能保证读/写继续正常工作,理想情况是master挂掉,最好slave中能自动(无需人工干预)选出一台充当master继续服务。redis 的cluster功能,目前尚处于beta阶段,估计不久的将来,等cluster功能正式发布后,可以通过custer功能搭建redis集群。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/4106142.html
Copyright © 2011-2022 走看看