摘要:使用操作輸出內(nèi)容歡迎關注微信公眾號面試通關手冊關閉連接,每次使用完畢后關閉連接。測試集群版創(chuàng)建一個對象。
今天早上由于zookeeper和redis集群不在同一虛擬機導致出了點很小錯誤(人為),所以這里總結一下redis集群的搭建以便日后所需同時也希望能對你有所幫助。
筆主這里使用的是Centos7.如果你碰到任何問題都可以來問我,留言或者加我微信:bwcx9393.
關于Linux的一些資料
鏈接:https://pan.baidu.com/s/1Opgu6kQe_b1IRJbxTGD6XA 密碼:8yk4
Redis是c語言開發(fā)的。
安裝redis需要c語言的編譯環(huán)境。如果沒有gcc需要在線安裝:yum install gcc-c++
第一步:獲取源碼包:wget http://download.redis.io/rele...
第二步:解壓縮redis:tar zxvf redis-3.0.0.tar.gz
第三步:編譯。進入redis源碼目錄(cd redis-3.0.0)。執(zhí)行 make
第四步:安裝。make install PREFIX=/usr/local/redis
PREFIX參數(shù)指定redis的安裝目錄。一般軟件安裝到/usr目錄下
這樣Redis就成功裝在了我們的usr/local/redis目錄下。
第五步:設置后臺啟動:
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/
(把/root/redis-3.0.0/redis.conf復制到/usr/local/redis/bin目錄下)
修改配置文件:把daemonize后面的參數(shù)改為yes
測試啟動:[root@localhost bin]# ./redis-server redis.conf
查看redis進程:
[root@localhost bin]# ps aux|grep redis
3.0版本之前的redis是不支持集群的,3.0版本之前想要搭建redis集群的話需要中間件來找到存值和取值的對應節(jié)點。
3.0版本以后的redis集群架構圖: 那么這是如何實現(xiàn)的呢???Redis 集群中內(nèi)置了 16384個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數(shù),這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據(jù)節(jié)點數(shù)量大致均等的將哈希槽映射到不同的節(jié)點。
根據(jù)下圖應該更容易理解了。(圖片來源:http://www.cnblogs.com/liyaso...)
redis集群中有多臺redis服務器不可避免會有服務器掛掉。redis集群服務器之間通過互相的ping-pong判斷是否節(jié)點可以連接上。如果有一半以上的節(jié)點去ping一個節(jié)點的時候沒有回應,集群就認為這個節(jié)點宕機了。
上面就是我們常說的為了容錯而生的redis集群投票機制。
redis集群搭建起來很簡單,我們這里用一臺虛擬機模擬搭建包含6個redis服務器的集群,實際工作中與使用多臺服務器搭建是一個操作。
我們上面已經(jīng)裝好了一個redis實例,現(xiàn)在我們需要把它復制6份并修改相應端口。
第一步: 新建redis-cluster文件夾
第二步:復制redis實例
[root@Snailclimb local]# cp redis/bin redis-cluster/redis1
如果你復制過去的redis實例有dump.rdb文件的話最好也要刪除。
第三步:修改配置文件
修改bin目錄下的redis.conf配置文件
第四步:繼續(xù)復制5個redis實例
我們用上面的redis實例復制5個redis實例,然后把他們的配置文件的端口號改為7002-7006
第五步 :新建一個執(zhí)行腳本:
[root@Snailclimb redis-cluster]# vim start-all.sh
腳本內(nèi)容如下:
cd redis1/bin ./redis-server redis.conf cd .. cd .. cd redis2/bin ./redis-server redis.conf cd .. cd .. cd redis3/bin ./redis-server redis.conf cd .. cd .. cd redis4/bin ./redis-server redis.conf cd .. cd .. cd redis5/bin ./redis-server redis.conf cd .. cd .. cd redis6/bin ./redis-server redis.conf
為腳本賦予執(zhí)行權限:
[root@Snailclimb redis-cluster]# chmod u+x start-all.sh
同時啟動6個redis實例:
[root@Snailclimb redis-cluster]# ./start-all.sh
第六步:將redis-trib.rb復制到redis-cluster目錄下面:
并為腳本賦予執(zhí)行權限:
[root@Snailclimb redis-cluster]# chmod u+x redis-trib.rb
第七步:安裝ruby和ruby運行環(huán)境
yum install ruby
yum install rubygems
gem install redis-3.0.0.gem
第八步:使用ruby腳本搭建集群:
[root@Snailclimb redis-cluster]#./redis-trib.rb create --replicas 1 192.168.25.130:7001 192.168.25.130:7002 192.168.25.130:7003 192.168.25.130:7004 192.168.25.130:7005 192.168.25.130:7006
查看集群:
注意:端口修改錯誤或者沒有將cluster-enabled yes前的注釋去掉都會導致集群搭建失敗。總的來說,redis集群搭建還是很簡單的。
這樣一個完整的redis集群就已經(jīng)搭建完畢了。。。
三 redis單機版與集群版的測試使用添加Maven依賴:
redis.clients jedis 2.7.2 junit junit 4.12 test
單機版redis測試:
@Test public void testJedis() throws Exception { // 創(chuàng)建一個連接Jedis對象,參數(shù):host、port Jedis jedis = new Jedis("192.168.25.130", 6379); // 直接使用jedis操作redis。所有jedis的命令都對應一個方法。 jedis.set("bwcx9393", "歡迎關注Java面試通關手冊"); String string = jedis.get("bwcx9393"); System.out.println(string);//輸出內(nèi)容:歡迎關注微信公眾號:Java面試通關手冊 // 關閉連接 jedis.close(); }
使用連接池測試單機版redis:
@Test public void testJedisPool() throws Exception { // 創(chuàng)建一個連接池對象,兩個參數(shù)host、port JedisPool jedisPool = new JedisPool("192.168.25.130", 6379); // 從連接池獲得一個連接,就是一個jedis對象。 Jedis jedis = jedisPool.getResource(); // 使用jedis操作redis String string = jedis.get("bwcx9393"); System.out.println(string);//輸出內(nèi)容:歡迎關注微信公眾號:Java面試通關手冊 // 關閉連接,每次使用完畢后關閉連接。連接池回收資源。 jedis.close(); // 關閉連接池。 jedisPool.close(); }
測試集群版redis:
@Test public void testJedisCluster() throws Exception { // 創(chuàng)建一個JedisCluster對象。有一個參數(shù)nodes是一個set類型。set中包含若干個HostAndPort對象。 Set四 如何在JavaWeb項目中實現(xiàn)單機和集群無縫切換使用nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.25.130", 7001)); nodes.add(new HostAndPort("192.168.25.130", 7002)); nodes.add(new HostAndPort("192.168.25.130", 7003)); nodes.add(new HostAndPort("192.168.25.130", 7004)); nodes.add(new HostAndPort("192.168.25.130", 7005)); nodes.add(new HostAndPort("192.168.25.130", 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); // 直接使用JedisCluster對象操作redis。 jedisCluster.set("test", "123"); String string = jedisCluster.get("test"); System.out.println(string); // 關閉JedisCluster對象 jedisCluster.close(); }
我們?nèi)绾尾拍茉陧椖恐袑崿F(xiàn)自己想用的單機redis就用單機redis想用redis集群就用redis集群而不要修改項目代碼呢???
創(chuàng)建相應類和接口
接口:
import java.util.List; public interface JedisClient { String set(String key, String value); String get(String key); Boolean exists(String key); Long expire(String key, int seconds); Long ttl(String key); Long incr(String key); Long hset(String key, String field, String value); String hget(String key, String field); Long hdel(String key, String... field); Boolean hexists(String key, String field); Listhvals(String key); Long del(String key); }
集群版使用:
import java.util.List; import redis.clients.jedis.JedisCluster; public class JedisClientCluster implements JedisClient { private JedisCluster jedisCluster; public JedisCluster getJedisCluster() { return jedisCluster; } public void setJedisCluster(JedisCluster jedisCluster) { this.jedisCluster = jedisCluster; } @Override public String set(String key, String value) { return jedisCluster.set(key, value); } @Override public String get(String key) { return jedisCluster.get(key); } @Override public Boolean exists(String key) { return jedisCluster.exists(key); } @Override public Long expire(String key, int seconds) { return jedisCluster.expire(key, seconds); } @Override public Long ttl(String key) { return jedisCluster.ttl(key); } @Override public Long incr(String key) { return jedisCluster.incr(key); } @Override public Long hset(String key, String field, String value) { return jedisCluster.hset(key, field, value); } @Override public String hget(String key, String field) { return jedisCluster.hget(key, field); } @Override public Long hdel(String key, String... field) { return jedisCluster.hdel(key, field); } @Override public Boolean hexists(String key, String field) { return jedisCluster.hexists(key, field); } @Override public Listhvals(String key) { return jedisCluster.hvals(key); } @Override public Long del(String key) { return jedisCluster.del(key); } }
單機版使用:
import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class JedisClientPool implements JedisClient { private JedisPool jedisPool; public JedisPool getJedisPool() { return jedisPool; } public void setJedisPool(JedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public String set(String key, String value) { Jedis jedis = jedisPool.getResource(); String result = jedis.set(key, value); jedis.close(); return result; } @Override public String get(String key) { Jedis jedis = jedisPool.getResource(); String result = jedis.get(key); jedis.close(); return result; } @Override public Boolean exists(String key) { Jedis jedis = jedisPool.getResource(); Boolean result = jedis.exists(key); jedis.close(); return result; } @Override public Long expire(String key, int seconds) { Jedis jedis = jedisPool.getResource(); Long result = jedis.expire(key, seconds); jedis.close(); return result; } @Override public Long ttl(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.ttl(key); jedis.close(); return result; } @Override public Long incr(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.incr(key); jedis.close(); return result; } @Override public Long hset(String key, String field, String value) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hset(key, field, value); jedis.close(); return result; } @Override public String hget(String key, String field) { Jedis jedis = jedisPool.getResource(); String result = jedis.hget(key, field); jedis.close(); return result; } @Override public Long hdel(String key, String... field) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hdel(key, field); jedis.close(); return result; } @Override public Boolean hexists(String key, String field) { Jedis jedis = jedisPool.getResource(); Boolean result = jedis.hexists(key, field); jedis.close(); return result; } @Override public Listhvals(String key) { Jedis jedis = jedisPool.getResource(); List result = jedis.hvals(key); jedis.close(); return result; } @Override public Long del(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.del(key); jedis.close(); return result; } }
applicationContext-redis.xml
測試代碼:
public class JedisClientTest { @Test public void testJedisClient() throws Exception { //初始化spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml"); //從容器中獲得JedisClient對象 JedisClient jedisClient = applicationContext.getBean(JedisClient.class); jedisClient.set("aaa", "111"); String string = jedisClient.get("aaa"); System.out.println(string); } }
這樣在實際項目中我們無需修改代碼就可以實現(xiàn)單機和集群版的相關切換。。
歡迎關注我的微信公眾號:"Java面試通關手冊"(堅持原創(chuàng),分享美文,分享各種Java學習資源,面試題,以及企業(yè)級Java實戰(zhàn)項目回復關鍵字免費領?。?/strong>。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69108.html
摘要:所以查閱官方文檔以及他人造好的輪子,總結了一些面試和學習中你必須掌握的問題。在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。 昨天寫了一篇自己搭建redis集群并在自己項目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結了一些redis面試和學習中你必須掌握的問題。...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復實現(xiàn)故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數(shù)據(jù)恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
閱讀 3353·2021-11-22 15:22
閱讀 2879·2021-10-12 10:12
閱讀 2172·2021-08-21 14:10
閱讀 3840·2021-08-19 11:13
閱讀 2857·2019-08-30 15:43
閱讀 3238·2019-08-29 16:52
閱讀 458·2019-08-29 16:41
閱讀 1446·2019-08-29 12:53