SpringBoot使用Redis存儲(chǔ)Session實(shí)踐
Session的基本概念
Session(會(huì)話)是一種在客戶端與服務(wù)器之間維持狀態(tài)的機(jī)制。它允許服務(wù)器在多個(gè)請(qǐng)求之間存儲(chǔ)用戶的數(shù)據(jù),以便用戶可以在訪問網(wǎng)站或應(yīng)用時(shí)維持某種程度的連續(xù)性和個(gè)性化體驗(yàn)。
以下是對(duì) session 的詳細(xì)解釋:
- -會(huì)話的定義: 會(huì)話指的是用戶與服務(wù)器之間的一系列互動(dòng)。通常從用戶登錄開始,到用戶退出或會(huì)話過期結(jié)束。
- -目的: 主要用于在用戶的多個(gè)請(qǐng)求之間保持狀態(tài)。這對(duì)于存儲(chǔ)用戶登錄狀態(tài)(十天免登錄)、購(gòu)物車內(nèi)容、用戶設(shè)置等非常重要。
Session的工作流程
- 用戶請(qǐng)求: 用戶訪問網(wǎng)站或應(yīng)用時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)新的 session。
- 生成 Session ID: 服務(wù)器生成一個(gè)唯一的 session ID(會(huì)話標(biāo)識(shí)符),這個(gè) ID 用于標(biāo)識(shí)用戶的會(huì)話。
- 存儲(chǔ) Session 數(shù)據(jù):服務(wù)器會(huì)將與用戶會(huì)話相關(guān)的數(shù)據(jù)存儲(chǔ)在服務(wù)器端,可以是內(nèi)存、數(shù)據(jù)庫(kù)、Redis 等。
- 發(fā)送 Session ID: 服務(wù)器將session ID 發(fā)送到客戶端,通常是通過 cookie。客戶端在后續(xù)請(qǐng)求中會(huì)帶上這個(gè) ID。
- 維護(hù)會(huì)話狀態(tài):在用戶進(jìn)行后續(xù)請(qǐng)求時(shí),服務(wù)器通過 session ID 找到對(duì)應(yīng)的會(huì)話數(shù)據(jù),繼續(xù)處理用戶請(qǐng)求。
- 會(huì)話結(jié)束:用戶注銷或會(huì)話超時(shí)后,會(huì)話數(shù)據(jù)會(huì)被銷毀或標(biāo)記為無效。
在Java Servlet中
- request.getSession(false) -> 是指獲取當(dāng)前請(qǐng)求的會(huì)話時(shí),如果沒有獲取到會(huì)話就不會(huì)創(chuàng)建一個(gè)新的會(huì)話,而是直接返回null
- request.getSession(true) 或者是 request.getSession() -> 是指如果請(qǐng)求的會(huì)話不存在,就創(chuàng)建一個(gè)新的,Java Servlet的getSession方法是默認(rèn)為true的
Session的常見應(yīng)用場(chǎng)景
- 用戶認(rèn)證: 記錄用戶的登錄狀態(tài),確保用戶在會(huì)話期間不需要重新登錄。
- 個(gè)性化設(shè)置: 存儲(chǔ)用戶的個(gè)性化設(shè)置或偏好,以提供個(gè)性化的體驗(yàn)。
- 購(gòu)物車: 在電商網(wǎng)站中,存儲(chǔ)購(gòu)物車的內(nèi)容。
Session的存儲(chǔ)方式
- 內(nèi)存: 在服務(wù)器內(nèi)存中存儲(chǔ)會(huì)話數(shù)據(jù)(適用于小型應(yīng)用或負(fù)載較低的環(huán)境)。
- 數(shù)據(jù)庫(kù): 將會(huì)話數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中(適用于需要持久化存儲(chǔ)和較高的數(shù)據(jù)可靠性的環(huán)境)。
- Redis: 使用 Redis 這種內(nèi)存數(shù)據(jù)庫(kù)來存儲(chǔ)會(huì)話數(shù)據(jù)(適用于高性能需求的場(chǎng)景)。
- 文件系統(tǒng): 將會(huì)話數(shù)據(jù)存儲(chǔ)在服務(wù)器的文件系統(tǒng)中(通常不太常見)。
接下來進(jìn)入正題Redis存儲(chǔ)Session
Redis存儲(chǔ)Session
Redis存儲(chǔ)Session的優(yōu)勢(shì)
高性能
- 內(nèi)存存儲(chǔ):Redis 是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),數(shù)據(jù)存儲(chǔ)在 RAM(隨機(jī)存取存儲(chǔ)器) 中,這使得讀寫操作非常快速,比傳統(tǒng)的磁盤存儲(chǔ)要快得多。
- 低延遲:Redis 的數(shù)據(jù)結(jié)構(gòu)操作非常高效,支持秒級(jí)的響應(yīng)時(shí)間,這對(duì)于需要快速會(huì)話訪問的應(yīng)用程序至關(guān)重要。
可擴(kuò)展性
- 水平擴(kuò)展: Redis 支持集群模式,可以通過將數(shù)據(jù)分布在多個(gè) Redis 實(shí)例上來水平擴(kuò)展。這意味著可以處理更多的會(huì)話數(shù)據(jù)和更高的負(fù)載。
- 持久化選項(xiàng): Redis 提供了多種持久化機(jī)制(如 RDB 快照和 AOF 追加文件),可以在一定程度上保證數(shù)據(jù)的持久性,同時(shí)保持較高的性能。
豐富的數(shù)據(jù)結(jié)構(gòu)
- 數(shù)據(jù)結(jié)構(gòu)支持: Redis 支持豐富的數(shù)據(jù)結(jié)構(gòu)(如字符串、哈希、列表、集合、有序集合等),這些數(shù)據(jù)結(jié)構(gòu)可以更靈活地存儲(chǔ)和操作會(huì)話數(shù)據(jù)。
- 過期策略: Redis 內(nèi)置了高效的過期策略,可以自動(dòng)清理過期的會(huì)話數(shù)據(jù),避免占用過多內(nèi)存。
高效的內(nèi)存管理
- 內(nèi)存優(yōu)化: Redis 提供了多種內(nèi)存管理選項(xiàng),如 LRU(最近最少使用)驅(qū)逐策略,確保在內(nèi)存有限的情況下優(yōu)先保留最常訪問的數(shù)據(jù)。
- 壓縮和編碼: Redis 支持?jǐn)?shù)據(jù)壓縮和編碼,以減少存儲(chǔ)空間和提高性能。
Spring Boot實(shí)現(xiàn)Redis存儲(chǔ)
導(dǎo)入依賴
<!--Redis存儲(chǔ)Session的依賴-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--Spring Boot 的 Redis依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
修改application配置文件
spring:
data:
redis:
port: 6379
host: localhost
database: 1 #修改存儲(chǔ)數(shù)據(jù)的redis庫(kù)
session:
timeout: 86400 #session的過期時(shí)間
store-type: redis #session 的存儲(chǔ)位置
完成上述配置就可以將session存入redis了
接下來寫一個(gè)示例代碼
@PostMapping("/login")
public String login(HttpServletRequest request){
String sessionUser = "session存儲(chǔ)進(jìn)來了";
request.getSession().setAttribute("session",sessionUser );
return "session存儲(chǔ)成功";
}
這是沒有存儲(chǔ)之前的Redis

這是存儲(chǔ)之后的Redis

存儲(chǔ)進(jìn)Redis的數(shù)據(jù)會(huì)亂碼是因?yàn)镽edis 默認(rèn)以二進(jìn)制安全的方式存儲(chǔ)數(shù)據(jù)因此,確保在存儲(chǔ)和讀取數(shù)據(jù)時(shí)使用一致的編碼格式非常重要。如果存儲(chǔ)時(shí)使用了不同的編碼格式或數(shù)據(jù)序列化方法,讀取時(shí)可能會(huì)出現(xiàn)亂碼問題。確保你的應(yīng)用在存儲(chǔ)和讀取 session 數(shù)據(jù)時(shí)使用相同的編碼和序列化方式,比如 JSON 或二進(jìn)制序列化,并確保數(shù)據(jù)的一致性。
上述查看Redis的應(yīng)用是QuickRedis,這個(gè)軟件可以快速查看Redis中的所有數(shù)據(jù)
如果之后要修改Redis中的session數(shù)據(jù)就重新setAttribute一次就可以了,這樣就會(huì)修改Redis中的session數(shù)據(jù)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot中redis實(shí)現(xiàn)session共享的示例
- SpringBoot項(xiàng)目中Redis存儲(chǔ)Session對(duì)象序列化處理
- 使用Redis存儲(chǔ)SpringBoot項(xiàng)目中Session的詳細(xì)步驟
- SpringBoot使用redis實(shí)現(xiàn)session共享功能
- SpringBoot集成redis實(shí)現(xiàn)共享存儲(chǔ)session
- SpringBoot集成redis與session實(shí)現(xiàn)分布式單點(diǎn)登錄
- SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例
相關(guān)文章
Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換
java中除了基本數(shù)據(jù)類型之外,剩下的都是引用數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型?+?四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2024-04-04
Java中使用正則表達(dá)式的一個(gè)簡(jiǎn)單例子及常用正則分享
這篇文章主要介紹了Java中使用正則表達(dá)式的一個(gè)簡(jiǎn)單例子及常用正則分享,本文用一個(gè)驗(yàn)證Email的例子講解JAVA中如何使用正則,并羅列了一些常用的正則表達(dá)式,需要的朋友可以參考下2015-06-06
Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸)
這篇文章主要介紹了Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸),具有一定參考價(jià)值,這里給大家分享下,供朋友們參考。2017-10-10
Java中Json字符串直接轉(zhuǎn)換為對(duì)象的方法(包括多層List集合)
下面小編就為大家?guī)硪黄狫ava中Json字符串直接轉(zhuǎn)換為對(duì)象的方法(包括多層List集合)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

