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

這是存儲之后的Redis

存儲進Redis的數(shù)據(jù)會亂碼是因為Redis 默認以二進制安全的方式存儲數(shù)據(jù)因此,確保在存儲和讀取數(shù)據(jù)時使用一致的編碼格式非常重要。如果存儲時使用了不同的編碼格式或數(shù)據(jù)序列化方法,讀取時可能會出現(xiàn)亂碼問題。確保你的應(yīng)用在存儲和讀取 session 數(shù)據(jù)時使用相同的編碼和序列化方式,比如 JSON 或二進制序列化,并確保數(shù)據(jù)的一致性。
上述查看Redis的應(yīng)用是QuickRedis,這個軟件可以快速查看Redis中的所有數(shù)據(jù)
如果之后要修改Redis中的session數(shù)據(jù)就重新setAttribute一次就可以了,這樣就會修改Redis中的session數(shù)據(jù)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(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中Json字符串直接轉(zhuǎn)換為對象的方法(包括多層List集合)
下面小編就為大家?guī)硪黄狫ava中Json字符串直接轉(zhuǎn)換為對象的方法(包括多層List集合)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08

