最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用Redis存儲(chǔ)Session實(shí)踐

 更新時(shí)間:2026年02月06日 15:48:32   作者:小福尼學(xué)編程  
本文介紹了Session的基本概念、工作流程和常見應(yīng)用場(chǎng)景,并詳細(xì)解釋了如何在JavaServlet中使用Session,接著,文章討論了Redis存儲(chǔ)Session的優(yōu)勢(shì)和配置方法,并提供了一個(gè)示例代碼,最后,總結(jié)了如何使用Redis存儲(chǔ)Session以及注意事項(xiàng)

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è)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評(píng)論

泰来县| 兰考县| 林口县| 旺苍县| 麟游县| 定日县| 宣汉县| 绥中县| 江川县| 双牌县| 沛县| 博湖县| 芦溪县| 泊头市| 云南省| 青神县| 玉屏| 铜鼓县| 云林县| 五河县| 潼关县| 海阳市| 澜沧| 隆尧县| 高密市| 吉木乃县| 大关县| 太保市| 页游| 邵阳市| 通江县| 永登县| 黑龙江省| 泗洪县| 舒城县| 雷州市| 怀集县| 英德市| 平阴县| 廉江市| 胶州市|