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集群。

时间: 2024-10-31 16:17:19

redis 学习笔记(3)-master/slave(主/从模式)的相关文章

redis 学习笔记(6)-cluster集群搭建

上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞sharding,现在方便多了,直接上cluster功能就行了,而且还支持节点动态添加.HA.节点增减后缓存重新分布(resharding). 下面是参考官方教程cluster-tutorial 在mac机上搭建cluster的过程: 一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http:

Redis学习笔记~StackExchange.Redis实现分布式Session

对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现,即session存储的问题,如一个用户登陆后,把一个状态信息存储到当前WEB服务器的session里,而你请求其它页面时,很可能就被路由到另一台服务器了,这时,session也就丢了,而对于这种情况,有人把redis这个存储中间件想了起来,对它进行了封装,就有了今天基于redis的session共享机制.

thinkphp学习笔记3—项目编译和调试模式

原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并缓存,第二次运行时直接载入编译缓存,这样省去一些IO开销,加快执行速度.并且在3.0以上的版本中海做了一些优化: 1.合并和兴编译缓存和项目编译缓存,不再生成两个缓存文件 2.直接对本地环境生成设置和常量定义减少环境判断 3.编译缓存可以直接替换框架入口甚至项目入口,甚至脱离框架独立运行 4.通过参

redis 学习笔记(4)-HA高可用方案Sentinel配置

上一节中介绍了master-slave模式,在最小配置:master.slave各一个节点的情况下,不管是master还是slave down掉一个,"完整的"读/写功能都将受影响,这在生产环境中显然不能接受.幸好redis提供了sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决 每个sentinel会向其它sentinal.master.slave定时发送消息,以确认对方是否"活

redis 学习笔记(5)-Spring与Jedis的集成

首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/从这上面看,当下流行的redis.solr.hadoop.mongoDB.couchBase... 全都收入囊中.对于redis整合而言,主要用到的是spring-data-redis 使用步骤: 一.pom添加依赖项 <dependency> <groupId>org.springframework.data</group

redis 学习笔记(7)-cluster 客户端(jedis)代码示例

上节学习了cluster的搭建及redis-cli终端下如何操作,但是更常用的场景是在程序代码里对cluster读写,这需要redis-client对cluster模式的支持,目前spring-data-redis(1.6.4)还不支持cluster,最新的1.7.0 RC1已经有cluster的相关实现了,不过目前尚未正式发布,所以现阶段要使用redis-cluster的话,client最好还是选用原生的jedis,示例代码如下: 配置文件: <?xml version="1.0&quo

redis学习笔记之常用命令(基础篇)

以下是redis命令行下的一些常用的基础命令,可以供大家参考学习: 1.[ set key value ] 存入一个key和值.如:set myname reson 2.[ get key ] 读取一个key的值. 3.[ del key ] 删除一个key. 4.[ del key1 key2 ... keyN ] 删除多个key.如:del myname1 myname2 5.[ exists key ] 判断一个key是否存在. 6.[ type key ] 查看key的类型. 7.[ r

php redis学习笔记

1,connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE <?php $redis = new redis(); $result = $redis->connect('127.0.0.1', 6379); var_dump($result); //结果:bool(true) ?> 2,set 描述:设置key和value的值 参数:Key Value 返回值:BOOL 成功返回:T

hibernate3学习笔记(十一)|复合主键

新建数据库User: 1.CREATE TABLE user (2. name VARCHAR(100) NOT NULL,3. phone VARCHAR(50) NOT NULL,4. age INT,5. PRIMARY KEY(name, phone)6.); 现将name和phone定义成复合主键.分别使用2种方法如下: 方法1.复合主键字段直接包含在PO类中. User.java(需要实现Serializable接口,并定义equals()和hashCode()方法) 1.packa