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