1. 程式人生 > >redis叢集實戰(單臺機器Windows環境下搭建3主3從redis叢集)

redis叢集實戰(單臺機器Windows環境下搭建3主3從redis叢集)

本文主要展示在單臺win10機器上搭建三主三從redis叢集。

搭建過程

主要參考作者: 每天都在變得更好的阿飛  的兩篇部落格

Redis叢集主從複製(一主兩從)搭建配置教程【Windows環境】https://blog.csdn.net/u010648555/article/details/79427606

《Redis建立高可用叢集教程【Windows環境】》https://blog.csdn.net/u010648555/article/details/79427608

這兩篇部落格非常詳細的介紹了搭建過程,裡面還有相應軟體的下載地址。

注意:

1、由於域名問題,在安裝RubyGems時,最終的ruby映象源修改為 Ruby China http://gems.ruby-china.com

/ ,字尾不再是org!!!。

安裝在安裝RubyGems的下載地址 https://rubygems.org/pages/download, 下載後解壓,當前目錄切換到解壓目錄中,如 D:\Program Files\redis\rubygems-2.6.12 然後在命令列執行ruby setup.rb安裝RubyGems。

2、redis-trib.rb檔案需要使用(redis3.2.0即可)的原始碼壓縮包中src資料夾下的redis-trib.rb檔案。

下載redis原始碼版壓縮包:http://download.redis.io/releases/

若redis-trib.rb檔案版本較低,會出現以下錯誤:

WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.

redis cluster使用

匯入依賴:

    <!--引入reids-->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

配置xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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.xsd">

    <description>redis cluster configuation</description>

    <bean id="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <!--連線池中最大空閒連線數, 預設8個-->
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <!--連線池中最小空閒連線數-->
        <property name="minIdle" value="${redis.pool.minIdle}"/>
        <!--連線池中最大連線數, 預設8個-->
        <property name="maxTotal" value="${redis.pool.maxTotal}"/>
        <!--是否啟用pool的jmx管理功能, 預設true-->
        <property name="jmxEnabled" value="${redis.pool.jmxEnabled}"/>
        <!--當連線池資源耗盡時,呼叫者最大阻塞的時間,超時將跑出異常。單位,毫秒數;預設為-1.表示永不超時-->
        <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
        <!--連線空閒的最小時間,達到此值後空閒連線將可能會被移除。負值(-1)表示不移除-->
        <property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"/>
        <!--對於“空閒連結”檢測執行緒而言,每次檢測的連結資源的個數。預設為3-->
        <property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}"/>
        <!--向呼叫者輸出“連結”資源時,是否檢測是有有效,如果無效則從連線池中移除,
           並嘗試獲取繼續獲取。預設為false。建議保持預設值.-->
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
        <!--向連線池“歸還”連結時,是否檢測“連結”物件的有效性。預設為false。建議保持預設值-->
        <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>
        <!--“空閒連結”檢測執行緒(用於釋放連結)檢測的週期(毫秒)。如果為負值,表示不執行“檢測執行緒”。預設為-1-->
        <property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"/>
        <!--連線耗盡時是否阻塞, false報異常,true阻塞直到超時, 預設true-->
        <property name="blockWhenExhausted" value="${redis.pool.blockWhenExhausted}"/>
    </bean>

    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster" destroy-method="close">
        <constructor-arg>
            <set>
                <bean id="jedisClusterNode1" class="redis.clients.jedis.HostAndPort">
                    <constructor-arg value="${jedisClusterNode.1.host}"/>
                    <constructor-arg value="${jedisClusterNode.1.port}"/>
                </bean>
                <bean id="jedisClusterNode2" class="redis.clients.jedis.HostAndPort">
                    <constructor-arg value="${jedisClusterNode.2.host}"/>
                    <constructor-arg value="${jedisClusterNode.2.port}"/>
                </bean>
                <bean id="jedisClusterNode3" class="redis.clients.jedis.HostAndPort">
                    <constructor-arg value="${jedisClusterNode.3.host}"/>
                    <constructor-arg value="${jedisClusterNode.3.port}"/>
                </bean>
            </set>
        </constructor-arg>
        <!--redis的連線超時時間-->
        <constructor-arg value="${redis.connectionTimeout}"/>
        <!--redis獲取資料超時時間-->
        <constructor-arg value="${redis.soTimeout}"/>
        <!--redis出現異常最大重試次數-->
        <constructor-arg value="${redis.maxAttempts}"/>
        <constructor-arg ref="genericObjectPoolConfig"/>
    </bean>

</beans>

redis.properties配置

# 本地redis叢集配置
jedisClusterNode.1.host=127.0.0.1
jedisClusterNode.1.port=20000
jedisClusterNode.2.host=127.0.0.1
jedisClusterNode.2.port=20001
jedisClusterNode.3.host=127.0.0.1
jedisClusterNode.3.port=20002
# timeout
redis.connectionTimeout=5000
redis.soTimeout=2000
redis.maxAttempts=3
# redis連線池配置
redis.pool.minIdle=1
redis.pool.maxIdle=50
redis.pool.maxTotal=512
redis.pool.jmxEnabled=false
redis.pool.maxWaitMillis=4000
redis.pool.minEvictableIdleTimeMillis=120000
redis.pool.numTestsPerEvictionRun=3
redis.pool.testOnBorrow=false
redis.pool.testOnReturn=false
redis.pool.timeBetweenEvictionRunsMillis=300000
redis.pool.blockWhenExhausted=true

編寫程式碼:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration //宣告一個ApplicationContext整合測試載入WebApplicationContext,作用是模擬ServletContext
@ContextConfiguration(locations={"classpath:spring/spring-application.xml"})
@Service
public class RedisServiceImpl implements RedisService {

    //private static final Logger logger = Logger.getLogger(RedisServiceImpl.class);

    @Autowired
    private JedisCluster jedisCluster;

    @Test
    public void testRedis( ) {
        jedisCluster.set("1","哈哈");
        System.out.println(jedisCluster.get("1"));
    }
}