類似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 }
注:經實際測試,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 }
后記:個人感覺master-slave模式作用有限,因為從二種client的測試結果看,在沒有其它監控機制的前提下,無論是master或slave掛掉,都需要手動調整配置或修改代碼,才能保證讀/寫繼續正常工作,理想情況是master掛掉,最好slave中能自動(無需人工干預)選出一台充當master繼續服務。redis 的cluster功能,目前尚處於beta階段,估計不久的將來,等cluster功能正式發布后,可以通過custer功能搭建redis集群。