192. redis集羣 原

 

 

本次是在 175的但單機版基礎上繼續的

單機版redis安裝:

https://my.oschina.net/springMVCAndspring/blog/1922742

1. 安裝好單機版redis(教程:上面鏈接)

2. 安裝redis集羣

2.1 準備

(0) 環境

  a.執行環境

   yum install ruby

b. 執行命令

yum install rubygems

c.導入集羣安裝插件

2.2 複製單機版的安裝成功後的文件

     

2.3 修改每一個集羣的配置文件

開通:9001 9002 ........9008 這8個端口

以9001舉例其他的一次類推

2.4 將9001的bin複製到其他7個文件夾

 複製完成後將每一個配置文件的端口修改修改就行

    2.5 修改每一個剩下7個的端口 並啓動這個8個服務

2.6  創建集羣

(1)複製集羣啓動文件

(2)創建集羣

注:如果下面代碼有問題 先放到text文檔中,有時候發生亂碼

./redis-trib.rb create --replicas 1 192.168.76.136:9001 192.168.76.136:9002 192.168.76.136:9003 192.168.76.136:9004 192.168.76.136:9005 192.168.76.136:9006

登錄集羣:

./redis-cli -c -h 192.168.76.136 -p 9001

查看9001的節點狀態

cluster info

查看集羣節點的關係

cluster nodes

3. 動態添加節點 分類存儲空間

3.1 添加節點

注:要添加的節點一定是啓動狀態

3.1.1 添加節點

-- 參考節點,表示把9007添加到9001所在集羣
./redis-trib.rb add-node 192.168.76.136:9007 192.168.76.136:9001

3.1.2 動態添加從節點

動態給主節點添加從節點:
./redis-trib.rb add-node --slave --master-id ce4954009a367177e1a5e569e8936d942edf56e8 192.168.76.136:9008 192.168.76.136:9001
add-node --slave:添加從節點
--master-id:主節點Id,表示添加從節點爲那個主節點的從節點
192.168.76.136:9001:參考節點,表示把9008添加到9001所在集羣

 

 

4. 給節點分配存儲空間


給新添加節點分配存儲空間:
./redis-trib.rb reshard 192.168.76.136:9001

 

5. 應用

5.1 redis客戶端

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

5.2 redis 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <!-- 創建連接池配置對象 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 設置最大連接數 -->
    <property name="maxTotal" value="1000"></property>
    <property name="maxIdle" value="20"></property>
    </bean>

    
    <!-- 創建Jedis連接池對象:單機版 -->
    <!--  <bean class="redis.clients.jedis.JedisPool">
        <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
        <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
        <constructor-arg name="port" value="6379"></constructor-arg>
    </bean> -->
    <!-- 創建Jedis集羣對象 -->
    <bean class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9001"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9002"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9003"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9004"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9005"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9006"></constructor-arg>
                </bean>
                
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9007"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.76.136"></constructor-arg>
                    <constructor-arg name="port" value="9008"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
    </bean>

</beans>

5.3  掃描接口

5.4 配置外部變量

爲了將一些需要變化的內容寫在資源文件中 

參考:https://my.oschina.net/springMVCAndspring/blog/2249002

5.5 添加redis緩存

    /**
     * 3.需求:跳轉到門戶系統首頁 
     */
    @Override
    public List<ADPojo> queryBigADByCategoryId(Long categoryId) { 
        
        //改進使用redis添加緩存
        //3.1  先去緩存中查詢該緩存是否存在    使用的時候 可以將封裝的JedisDao  及實現類 JedisDaoImpl直接複製
        String dataJson = jedisDao.hget(bigAD, categoryId+"");
        if(StringUtils.isNotBlank(dataJson)){
            List<ADPojo> adList = JSON.parseArray(dataJson,ADPojo.class);//使用fastjson將資源json轉list集合
            return  adList;
        }
else{
            //3.2 去數據庫查詢
            //用於封裝數據
            List<ADPojo>  resultList = new  ArrayList<ADPojo>();
            //根據分類id 去內容表(tb_content)
            List<TbContent>  list =    contentMapper.queryBigADByCategoryId(categoryId);//大廣告
            for (TbContent tbContent : list) {
                ADPojo ad = new ADPojo();
                //提示 信息
                ad.setAlt(tbContent.getTitle());
                //大廣告圖片高度
                ad.setHeight(height);
                ad.setHeightB(heightB);
                //大廣告位圖片寬
                ad.setWidth(width);
                ad.setWidthB(widthB);
                //跳轉鏈接
                ad.setHref(tbContent.getUrl());
                //照片路徑
                ad.setSrc(tbContent.getPic());
                ad.setSrcB(tbContent.getPic2());
                //將每個對象封裝到list
                resultList.add(ad);
                
            }
            //3.3 如果緩存沒有數據,查詢數據庫,查詢數據同時需要把數據添加到redis緩存
            jedisDao.hset(bigAD, categoryId+"", JSONObject.toJSONString(resultList));

            return resultList;
        }
    }

5.6 抽取的接口及實現類

package cn.guang.shopping.centent.jedis;

public interface JedisDao {
    
    //抽取redis經常使用方法
    //String
    public String set(String key,String value);
    public String get(String key);
    //自增
    public Long incr(String key);
    //自減
    public Long decr(String key);
    //hash
    public Long hset(String key,String field,String value);
    public String hget(String key,String field);
    public Long hdel(String key,String field);
    //設置過期
    public Long expire(String key,int seconds);
    //查看過期時間
    public Long ttl(String key);
    
    //刪除
    public Long del(String key);

}
 

 

package cn.guang.shopping.centent.jedis.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.guang.shopping.centent.jedis.JedisDao;
import redis.clients.jedis.JedisCluster;
@Repository//交給spring管理
public class ClusterJedisDaoImpl implements JedisDao{
    
    //注入集羣對象
    @Autowired
    private JedisCluster jCluster;

    @Override
    public String set(String key, String value) {
        // TODO Auto-generated method stub
        String set = jCluster.set(key, value);
        return set;
    }

    @Override
    public String get(String key) {
        String value = jCluster.get(key);
        return value;
    }

    @Override
    public Long incr(String key) {
        Long incr = jCluster.incr(key);
        return incr;
    }

    @Override
    public Long decr(String key) {
        // TODO Auto-generated method stub
        Long decr = jCluster.decr(key);
        return decr;
    }

    @Override
    public Long hset(String key, String field, String value) {
        Long hset = jCluster.hset(key, field, value);
        return hset;
    }

    @Override
    public String hget(String key, String field) {
        String hget = jCluster.hget(key, field);
        return hget;
    }

    @Override
    public Long hdel(String key, String field) {
        Long hdel = jCluster.hdel(key, field);
        return hdel;
    }

    @Override
    public Long expire(String key, int seconds) {
        Long expire = jCluster.expire(key, seconds);
        return expire;
    }

    @Override
    public Long ttl(String key) {
        Long ttl = jCluster.ttl(key);
        return ttl;
    }
    
    @Override
    public Long del(String key) {
        Long del = jCluster.del(key);
        return del;
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章