歡迎轉至站內查看原文,鏈接爲: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