1. 程式人生 > >Spring-Session實現Session共享Redis叢集方式配置教程

Spring-Session實現Session共享Redis叢集方式配置教程

循序漸進,由易到難,這樣才更有樂趣!

概述

本篇開始繼續上一篇的內容基礎上進行,本篇主要介紹Spring-Session實現配置使用Redis叢集,會有兩種配置方式,一種是Redis-Cluster,一種是Redis-Sentinel,並通過一個簡單的demo進行例項演示!

對Redis-Cluster和Redis-Sentinel不太懂,或者不知道在Windows下面如何搭建的夥伴,請先移步到,

進行簡單的學習和配置好本次需要的環境!

Spring-Session 整合Redis叢集

由於有了上一篇的介紹,上一篇中新增依賴:

spring-session-data-redis

而這個jar包會自動下載Spring-session和Jedis的依賴

spring-session
jedis

本次開始就直接上程式碼和配置,並進行簡單的說明!

redis.properties

#jedisPoolConfig
redis.maxTotal=10
redis.maxIdle=8
redis.minIdle=0
redis.testOnBorrow=true
redis.testOnReturn=true
redis.maxWaitMillis=-1
redis.blockWhenExhausted=true
redis.evictionPolicyClassName
=org.apache.commons.pool2.impl.DefaultEvictionPolicy #redis-sentinel redis.sentinel1.host=127.0.0.1 redis.sentinel1.port=26379 redis.sentinel2.host=127.0.0.1 redis.sentinel2.port=26380 redis.sentinel3.host=127.0.0.1 redis.sentinel3.port=26381 #redis-cluster #重試次數,在執行失敗後,進行的重試次數,預設是5 #此值設定過大時,容易報:Too many Cluster redirections
redis.cluster.maxRedirects=3 redis.cluster0.host=127.0.0.1 redis.cluster0.port=20000 redis.cluster1.host=127.0.0.1 redis.cluster1.port=20001 redis.cluster2.host=127.0.0.1 redis.cluster2.port=20002 redis.cluster3.host=127.0.0.1 redis.cluster3.port=20003 redis.cluster4.host=127.0.0.1 redis.cluster4.port=20004 redis.cluster5.host=127.0.0.1 redis.cluster5.port=20005

Spring-Session 整合Redis-Sentinel

Redis-Sentinel配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!-- 開啟註解方式 -->
    <context:annotation-config/>

    <!--可以將redis配置寫入配置檔案中-->
    <context:property-placeholder location="classpath:redis.properties"/>

    <!--建立一個Spring Bean的名稱springSessionRepositoryFilter實現過濾器。
    篩選器負責將HttpSession實現替換為Spring會話支援。在這個例項中,Spring會話得到了Redis的支援。-->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

    <!--建立了一個RedisConnectionFactory,它將Spring會話連線到Redis伺服器。我們配置連線到預設埠(6379)上的本地主機!-->

    <!-- //單機Redis
    <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg ref="jedisPoolConfig"/>
        <property name="port" value="6379"/>
        <property name="hostName" value="localhost"/>
    </bean>
    -->
    <!--叢集Redis-->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <!--Redis-Sentinel-->
        <constructor-arg index="0" ref="redisSentinelConfig"/>

        <!--配置Redis連線池 ,測試使用可以不配置,使用預設就行!-->
        <constructor-arg index="1" ref="jedisPoolConfig"/>

    </bean>

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

        <!--最大連線數, 預設8個-->
        <property name="maxTotal" value="${redis.maxTotal}"/>

        <!--最大空閒連線數, 預設8-->
        <property name="maxIdle" value="${redis.maxIdle}"/>

        <!--最小空閒連線數, 預設0-->
        <property name="minIdle" value="${redis.minIdle}"/>

        <!--在獲取連線的時候檢查有效性, 預設false-->
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>

        <!--在空閒時檢查有效性, 預設false, 新版jedis 不支援這個引數了-->
        <property name="testOnReturn" value="${redis.testOnReturn}"/>

        <!--獲取連線時的最大等待毫秒數(如果設定為阻塞時BlockWhenExhausted),如果超時就拋異常, 小於零:阻塞不確定的時間,  預設-1-->
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>

        <!--連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true-->
        <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}"/>

        <!--設定的逐出策略類名, 預設DefaultEvictionPolicy(當連線超過最大空閒時間,或連線數超過最大空閒連線數)-->
        <property name="evictionPolicyClassName" value="${redis.evictionPolicyClassName}"/>

        <!--還有很多配置引數,引數的調優還沒接觸過,後面有機會結合專案整理整理-->
    </bean>

    <!--哨兵模式配置-->
    <bean id="redisSentinelConfig" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">

        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="mymaster"></property>
            </bean>
        </property>

        <property name="sentinels">
            <set>
                <bean  id="sentinel1" class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.sentinel1.host}"/>
                    <constructor-arg name="port" value="${redis.sentinel1.port}"/>
                </bean>
                <bean  id="sentinel2" class="org.springframework.data.redis.connection.RedisNode" >
                    <constructor-arg name="host" value="${redis.sentinel2.host}"/>
                    <constructor-arg name="port" value="${redis.sentinel2.port}"/>
                </bean>
                <bean  id="sentinel3" class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.sentinel3.host}"/>
                    <constructor-arg name="port" value="${redis.sentinel3.port}"/>
                </bean>
            </set>
        </property>
    </bean>

</beans>

Spring-Session 整合Redis-Cluster

Redis-Cluster配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!-- 開啟註解方式 -->
    <context:annotation-config/>


    <!--可以將redis配置寫入配置檔案中-->
    <context:property-placeholder location="classpath:redis.properties"/>

    <!--建立一個Spring Bean的名稱springSessionRepositoryFilter實現過濾器。
    篩選器負責將HttpSession實現替換為Spring會話支援。在這個例項中,Spring會話得到了Redis的支援。-->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

    <!--建立了一個RedisConnectionFactory,它將Spring會話連線到Redis伺服器。我們配置連線到預設埠(6379)上的本地主機!-->
    <!--叢集Redis-->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <!--Redis-CLuster-->
        <constructor-arg index="0" ref="redisClusterConfig"/>

        <!--配置Redis連線池 ,可以不配置,使用預設就行!-->
        <constructor-arg index="1" ref="jedisPoolConfig"/>
    </bean>


    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

        <!--最大連線數, 預設8個-->
        <property name="maxTotal" value="${redis.maxTotal}"/>

        <!--最大空閒連線數, 預設8-->
        <property name="maxIdle" value="${redis.maxIdle}"/>

        <!--最小空閒連線數, 預設0-->
        <property name="minIdle" value="${redis.minIdle}"/>

        <!--在獲取連線的時候檢查有效性, 預設false-->
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>

        <!--在空閒時檢查有效性, 預設false, 新版jedis 不支援這個引數了-->
        <property name="testOnReturn" value="${redis.testOnReturn}"/>

        <!--獲取連線時的最大等待毫秒數(如果設定為阻塞時BlockWhenExhausted),如果超時就拋異常, 小於零:阻塞不確定的時間,  預設-1-->
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>

        <!--連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true-->
        <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}"/>

        <!--設定的逐出策略類名, 預設DefaultEvictionPolicy(當連線超過最大空閒時間,或連線數超過最大空閒連線數)-->
        <property name="evictionPolicyClassName" value="${redis.evictionPolicyClassName}"/>

        <!--還有很多配置引數,引數的調優還沒接觸過,後面有機會結合專案整理整理-->
    </bean>

    <!--叢集模式配置-->
    <bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
        <property name="maxRedirects" value="${redis.cluster.maxRedirects}"/>
        <property name="clusterNodes">
                <set>
                    <bean id="cluster0" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster0.host}"/>
                        <constructor-arg name="port" value="${redis.cluster0.port}"/>
                    </bean>
                    <bean id="cluster1" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster1.host}"/>
                        <constructor-arg name="port" value="${redis.cluster1.port}"/>
                    </bean>
                    <bean id="cluster2" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster2.host}"/>
                        <constructor-arg name="port" value="${redis.cluster2.port}"/>
                    </bean>
                    <bean id="cluster3" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster3.host}"/>
                        <constructor-arg name="port" value="${redis.cluster3.port}"/>
                    </bean>
                    <bean id="cluster4" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster4.host}"/>
                        <constructor-arg name="port" value="${redis.cluster4.port}"/>
                    </bean>
                    <bean id="cluster5" class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="${redis.cluster5.host}"/>
                        <constructor-arg name="port" value="${redis.cluster5.port}"/>
                    </bean>
            </set>
            </property>
    </bean>

</beans>

演示驗證

只演示Redis-Cluster,Redis-Cluster和Redis-Cluster就配置稍有不同,其他一樣!

啟動Redis

啟動Nginx

啟動兩臺Tomcat

上述三步和上一篇一樣,這裡就不在介紹!

檢視Session儲存效果

使用RedisDesktopManager,具體看下面截圖,儲存成功!
檢視Session的儲存情況

本次叢集配置教程結束!

參考文章

本系列教程

本系列教程


如果您覺得這篇博文對你有幫助,請點個贊,讓更多的人看到,謝謝!


如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!

歡迎訪問我的csdn部落格,我們一同成長!

不管做什麼,只要堅持下去就會看到不一樣!在路上,不卑不亢!