1. 程式人生 > >分散式系統架構——Redis快取的安裝和使用

分散式系統架構——Redis快取的安裝和使用

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。

一、Redis的單機版

1.1 安裝步驟

  1. 安裝gcc編譯環境
    sudo apt-get install gcc
  2. 把redis上傳到伺服器
    可以使用SecureCRT上傳
  3. 解壓縮
    tar -zxvf redis-3.2.0.tar.gz
  4. make
    cd redis-3.2.0
    make
  5. 安裝
    make install PREFIX=/home/muxiaocao/redis-3.2.0

    這時候在redis根目錄下就會出現一個bin資料夾,裡面就是編譯好的一些可執行檔案

1.2 啟動redis

兩種啟動方式:

前端啟動

`./redis-server`

後臺啟動

  1. 複製redis.conf到redis的bin目錄下
    cd /home/muxiaocao/redis-3.2.0
    cp redis.conf bin
  2. 修改bin目錄下的redis.conf中的daemonize yes和bing
    vim redis.conf
    bind 192.168.3.111
    注意:這裡的bind是需要繫結自己的ip而不是訪問這的ip。
    bind localhost 只能本機訪問,區域網內計算機不能訪問
    bind 區域網IP 只能區域網內IP的機器訪問, 本地localhost都無法訪問.
  3. 啟動:./redis-server redis.conf
    ./redis-server redis.conf
  4. 檢視程序:ps aux|grep redis
    這裡寫圖片描述

1.3 命令列客戶端

`redis-cli -p 埠 -h ip地址 連結叢集時使用此引數`

預設埠是6379,ip預設是localhost
這裡寫圖片描述

1.4 Redis Desktop Manager客戶端

Redis Desktop Manager是redis的影象介面

![這裡寫圖片描述](https://img-blog.csdn.net/20160604223112307)

二、Redis叢集

2.1 架構

![這裡寫圖片描述](https://img-blog.csdn.net/20160605151323570) **架構細節:**
  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
  2. 節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
  3. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
  4. redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
    Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

2.2 叢集搭建

叢集中應該至少有三個節點,每個節點有一備份節點。需要6臺伺服器。
所以搭建偽分散式,需要6個redis例項。

步驟1:

第一步:建立6個redis例項指定埠從7001到7006
這裡寫圖片描述
第二步:修改redis.conf 開啟Cluster-enable yes前面的註釋。
這裡寫圖片描述
這裡寫圖片描述
第三步:需要一個ruby指令碼。在redis原始碼資料夾下的src目錄下。redis-trib.rb

第四步:把redis-trib.rb檔案複製到到redis-cluster目錄下。

第五步:執行ruby指令碼之前,需要安裝ruby環境:

1. sudo apt-get install ruby 2.2.2
    檢視ruby版本:ruby -version
    如果小於2.2.2,則需要手動下載較高版本步驟如下:
    1. wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
    2. tar -xvf ruby-2.2.2.tar.gz
    3. ./configure --prefix=/home/muxiaocao/redis/ruby-2.2.2
    4. make && make install
    5. gem install redis
2. sudo apt-get install gems
3. gem install rubygems-update
4. 安裝redis-trib.rb執行依賴的ruby的包。sudo gem install redis-3.2.1.gem

第六步:啟動所有的redis例項

1. 建立指令碼vim start-all.sh寫入:

這裡寫圖片描述
2. 賦予執行許可權chmod +x start-all.sh
3. 執行./start-all

第七步:使用redis-trib.rb建立叢集。
./redis-trib.rb create –replicas 1 192.168.3.111:7001 192.168.3.111:7002 192.168.3.111:7003 192.168.3.111:7004 192.168.3.111:7005 192.168.3.111:7006
這裡寫圖片描述
注意:如果出現以下情況,是需要重新安裝redis
這裡寫圖片描述
成功結果:
這裡寫圖片描述
在看視覺化介面:
這裡寫圖片描述

如果想了解redis的更多命令可點選這裡

三、Redis的java客戶端使用

Redis的java客戶端需要使用Jedis,我們可以使用maven依賴:

<!-- Redis客戶端 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>

3.1 單機版

    // 單機版測試
    @Test
    public void testJedisSingle() throws Exception {
        Jedis jedis = new Jedis("192.168.3.111", 6379);
        jedis.set("test", "hello jedis");
        String result = jedis.get("test");
        System.out.println(result);
        jedis.close();
    }

3.2 連線池版

    // 使用連線池
    @Test
    public void testJedisPool() throws Exception {
        // 建立一個連線池物件
        // 在系統中應該是單例的
        JedisPool jedisPool = new JedisPool("192.168.3.111", 6379);
        Jedis jedis = jedisPool.getResource();
        String string = jedis.get("test");
        System.out.println(string);
        // 使用完jedis必須關閉
        jedis.close();
        // 當系統關閉時,關閉連線池
        jedisPool.close();
    }

3.3 叢集版

    // 叢集版測試
    @Test
    public void testJedisCluster() throws Exception {
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.3.111", 7001));
        nodes.add(new HostAndPort("192.168.3.111", 7002));
        nodes.add(new HostAndPort("192.168.3.111", 7003));
        nodes.add(new HostAndPort("192.168.3.111", 7004));
        nodes.add(new HostAndPort("192.168.3.111", 7005));
        nodes.add(new HostAndPort("192.168.3.111", 7006));
        // 在系統中是單例的
        JedisCluster jedisCluster = new JedisCluster(nodes);
        jedisCluster.set("name", "張三");
        jedisCluster.set("value", "1000");
        String name = jedisCluster.get("name");
        String value = jedisCluster.get("value");
        System.out.println(name + "," + value);

        // 在系統關閉時關閉
        jedisCluster.close();
    }

3.4 Spring結合版

第一步:定義介面

package com.taotao.rest.service;

/**
 * <p>Description:Dubbo快取服務提供者介面</p>
 * <p>JedisClient.java</P>
 * <p>個人主頁:www.muxiaocao.cn/me </p>
 * @author 木小草
 * @date:  2016年6月4日 下午8:15:07
 * @version: 1.0
 */
public interface JedisClientService {

    public String set(String key,String value);
    public String get(String key);
    public Long hset(String key,String item,String value);
    public String hget(String key,String item);
    public Long incr(String key);
    public Long decr(String key);
    // 設定有效時間
    public Long expire(String key,int second);
    // 返回有效時間:-1:永久儲存 -2:已經失效 大於0:有效時間(單位s)
    public Long ttl(String key);
}

第二步:介面實現
單機版實現:
這裡寫圖片描述
叢集版實現:
這裡寫圖片描述
第三步:配置檔案

<!-- ======================Redis快取=========================== -->

    <!-- 配置redis客戶端單機版 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
        <constructor-arg name="port" value="6379"></constructor-arg>
    </bean>
    <!-- 配置redis客戶端實現類 -->
    <bean id="jedisClientService" class="com.taotao.rest.service.impl.JedisClientSingle"/>


    <!-- 配置redis客戶端叢集版 -->
    <!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg>
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.3.111"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
    </bean>
    <bean id="jedisClientService" class="com.taotao.rest.service.impl.JedisClientCluster"/> -->

注意:轉載請標明,轉自itboy-木小草
尊重原創,尊重技術。