国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一文輕松搞懂redis集群原理及搭建與使用

jiekechoo / 1483人閱讀

摘要:使用操作輸出內(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的安裝

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

二 redis集群的搭建 2.1 redis集群(redis-cluster)原理

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集群投票機(jī)制

redis集群中有多臺redis服務(wù)器不可避免會有服務(wù)器掛掉。redis集群服務(wù)器之間通過互相的ping-pong判斷是否節(jié)點可以連接上。如果有一半以上的節(jié)點去ping一個節(jié)點的時候沒有回應(yīng),集群就認(rèn)為這個節(jié)點宕機(jī)了。

上面就是我們常說的為了容錯而生的redis集群投票機(jī)制

2.2 redis集群(redis-cluster)的搭建

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 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();
    }
四 如何在JavaWeb項目中實現(xiàn)單機(jī)和集群無縫切換使用

我們?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);
    List hvals(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 List hvals(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 List hvals(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

相關(guān)文章

  • 面試中關(guān)于Redis的問題看這篇就夠了

    摘要:所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些面試和學(xué)習(xí)中你必須掌握的問題。在微博應(yīng)用中,可以將一個用戶所有的關(guān)注人存在一個集合中,將其所有粉絲存在一個集合。 昨天寫了一篇自己搭建redis集群并在自己項目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問題。...

    yanbingyun1990 評論0 收藏0
  • 【推薦】最新200篇:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(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ù)制的原理詳...

    BicycleWarrior 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<