Spring Session Redis最佳實踐(1)簡單入門

歡迎轉至站內查看原文,鏈接爲:https://www.chendd.cn/information/viewInformation/experienceShare/309.a

如果你關注Spring Session JDBC的實現可關注前面一篇文章。本文所謂的Spring Session Redis的簡單入門,主要是根據github上的Spring Session項目源碼實踐而來,具體是從該項目中摘一些示例代碼,按照需要,修改而來。

目錄

本文目標

最佳實踐

總結一下

源碼下載


本文目標

實現基於Redis的Spring Session管理(不含Redis的搭建過程),spring-session-data-redis的版本爲2.1.3.RELEASE,依賴的Spring版本爲5.1.4.RELEASE,實現一個分佈式的Session管理示例,多個服務器(端口不同)下session數據一致。

最佳實踐

(一)Maven依賴

<!-—spring redis相關 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>
<!—servlet與jstl環境,示例中爲JSP -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<!—logback 日誌管理 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>
<!-- json -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

(二)session.xml參數配置

<!—-載入參數配置文件properties-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <array>
            <value>classpath:spring-config-redis.properties</value>
        </array>
    </property>
</bean>

<!--直接採用property的形式可以看到很多屬性已經過期了-->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      p:hostName="${spring.redis.hostName}" p:port="${spring.redis.port}" p:database="${spring.redis.database}"
      p:poolConfig-ref="jedisPoolConfig"
>
</bean>

<!—-Jedis參數配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="${spring.redis.maxTotal}"/>
    <property name="maxIdle" value="${spring.redis.maxIdle}"/>
    <property name="minIdle" value="${spring.redis.minIdle}"/>
    <property name="testOnBorrow" value="${spring.redis.testOnBorrow}"/>
    <property name="maxWaitMillis" value="${spring.redis.maxWaitMillis}"/>
</bean>

(三)頁面示例效果--session在不同服務器上的數據共享

(同一個session在8080服務器保存的數據)

(同一個session在8888服務器保存的數據)

總結一下

(1)前面的 jedisConnectionFactory 對象配置屬性時,IDEA中給出了一些屬性設置時是過期的,爲了屏蔽過期的屬性顯示,故寫成了 p:port 的寫法,正常使用 property 屬性聲明即可;

(2)當logback的日誌級別爲debug時,啓動時控制檯會有錯誤的堆棧日誌輸出,但它不算是錯,將日誌級別調整爲info後可以屏蔽,參考如下圖所示:

(3)既然數據已經存儲至Redis了,一起來分析一下它存的都是些什麼值,比如瀏覽器創建了一個Session ID,對應的Redis下對應了3條數據(與之前的JDBC一致),參考如下:

在Redis中查看其具體的數值信息,發現它默認存儲的數據爲Java序列化後的數據,它的具體數值存儲的有一些個具體的屬性值,如過期時間、sessionKey等等,還有一些看起來不能識別的特殊字符,它們都是Java序列化存儲的結果,詳細如下圖所示:

--查看某個session ID的對象數據
127.0.0.1:6379[5]> hgetall "spring:session:sessions:c3c007d3-fdd9-4ccf-ae55-1e8a53404cdf"
--查看某個session ID的某個屬性
127.0.0.1:6379[5]> hget "spring:session:sessions:c3c007d3-fdd9-4ccf-ae55-1e8a53404cdf" "creationTime"

(4)其實我是Redis新手,如果要問我上面的命令是如何總結出來的,我會說我有使用Jedis客戶端連接後,使用它提供的Java Api進行的分析,比如它裏面有個 type 函數,我們可以知道這個session ID存儲的到底是個什麼類型的結構,以及使用這個結構找到其對應的取數函數將數據給顯示出來。

源碼下載

https://gitee.com/88911006/chendd-examples

 

 

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