分布式環境下的session 共享-基于spring-session組件和Redis實現

1、問題概述

不是所有的項目都是單機模式的,當一個項目服務的局域比較廣,用戶體量比較大,數據量較大的時候,我們都會將項目部署到多臺服務器上,這些個服務器都是分布在不同的區域,這樣實現了項目的負載和并發量,但同時也引發了一些問題。如我們將登錄信息放在session中,通過session中的用戶信息判斷用戶是否登錄的時候。如下圖:

從下圖可以看出,當用戶第一次攜帶正確的用戶名和密碼到達服務器1的時候,用戶信息會被存放在服務器1的內存中,當用戶再次發起請求的時候,這個時候可能訪問的是服務器2,這個時候服務器2無法獲取存放在服務器1中的用戶信息,從而引發報錯,提示用戶未登錄。

7c2fe9a2b56b4925a851ec1b675a063e.png

這個時候我們會有很多的解決方案,本案例講述使用spring-session+redis的解決方案。

Redis是基于內存的,數據的讀寫性能都非常的高。

如下圖:

202c3a8ce9d74698916b651bfded89b6.png

5.2、Linux中安裝Redis過程

詳細博客:https://blog.csdn.net/tangshiyilang/article/details/129806747

5.3、創建工程并選擇如下包信息

主要包信息:spring-data-redis+spring session包

310496a429124e43ae1f448cbaab592a.png

5.3、工程pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>distributed-session</artifactId><version>0.0.1-SNAPSHOT</version><name>distributed-session</name><description>distributed-session</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

5.4、配置連接Redis和springsession配置信息

store-type: redis:必須要添加這條信息,告訴程序session信息要存入到redis中。

server:port: 8081
spring:data:redis:database: 0host: 192.168.133.145port: 6379timeout: 5000password: 123456session:store-type: redistimeout: 3600redis:namespace: logininfo

5.5、創建UserController實現登錄和查看用戶信息

login:用戶用戶登錄,必須傳入username參數

getUserInfo:用于獲取當前用戶的登錄信息

@RestController
public class UserController {@RequestMapping("/login")public String login(@RequestParam String username,HttpSession session){System.out.println("==========login=============");session.setAttribute("username",username);return "登錄成功";}@RequestMapping("/getUserInfo")public String getUserInfo(HttpSession session){return "當前登錄用戶=>"+session.getAttribute("username");}
}

5.6、在啟動類通過注解開啟

核心注解:@EnableRedisHttpSession

@SpringBootApplication
@EnableRedisHttpSession
public class DistributedSessionApplication {public static void main(String[] args) {SpringApplication.run(DistributedSessionApplication.class, args);}
}

5.7、通過瀏覽器訪問login實現登錄

請求地址:http://localhost:8081/login?username=xiaochun

8655ef475b164d97a1075ad35111f072.png

5.8、登錄之后查看redis中的session信息

sessionAttr:username:存放了用戶登錄的信息

creationTime:session:創建時間

maxInactiveInterval:最大的不活動時間

lastAccessedTime:最后的訪問時間

cb4a4056a150403dae669fc15aa77773.png5.9、基于IDEA啟動兩個工程

我們基于idea創建兩個工程,模擬分布式環境,端口分別是8081和8082端口。

用戶模擬用戶第一次訪問進入服務器1,然后訪問服務器2的時候可以直接獲取訪問服務器1時候的用戶登錄信息。

5.9.1、在idea中選中edit configurations配置項目

9d5a02f2b9164486a0378973cda791dc.png

5.9.2、選擇Modify options選項

a5a6881e6c7f45bcab7a699e2985e8cd.png

5.9.3、在下拉框中選擇Add VM options

?

5.9.4、在輸入框中輸入端口信息

ec6d72e3f35b49958be362c2f7247d5c.png

5.9.5、復制第一個啟動項并修改名稱和端口

1318336d82174747a66fcbcecf65b623.png

5.9.6、分別啟動兩個工程

1a7991a487de4c69b342321b8825bf57.png

5.9.7、通過8081號端口訪問login登錄接口

18290712649d42f38226d9daa13392d3.png5.9.8、通過8082號端口訪問getUserInfo接口

這個時候我們發現可以直接獲取到session中的信息,因為兩個工程都是使用redis中的存放的session信息。

f485da65bb814d1cb6cd565d5a19f0dd.png

5.10、清空session信息

sesssion.invalidate();

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis有序集合對象

一.編碼 有序集合的編碼可以是ziplist或者skiplist。 ziplist編碼的有序集合對象使用壓縮列表作為底層實現&#xff0c;每一個集合元素使用緊挨在一起的兩個壓縮列表節點來保存。第一個節點保存元素的成員(member)&#xff0c;而第二個元素則保存元素的分值(score)。 127.0.0.…

鴻蒙app獲取文本控件按鈕控件_修改控件名稱_按鈕觸發事件_提示信息顯示

鴻蒙app獲取文本控件按鈕控件_修改控件名稱_按鈕觸發事件_ 點擊啟動&#xff1a;提示信息顯示 package com.example.myapplication.slice;import com.example.myapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; impor…

12.1電梯控制器——文檔記錄

《數字邏輯》實驗報告 實驗名稱 項目三 電梯控制器設計 一、實驗目的 設計一個多樓層的電梯控制器系統&#xff0c;并能在開發板上模擬電梯運行狀態。可以利用按鍵作為呼叫按鍵&#xff0c;數碼管顯示電梯運行時電梯所在樓層&#xff0c;led燈顯示樓層叫梯狀態。 二、實…

太良心了!微軟面向初學者,開源機器學習、數據科學、AI、LLM

大家好&#xff0c;推薦幾個質量上乘且完全免費的微軟開源課程&#xff0c;由粉絲小伙伴梳理&#xff0c;分享給大家。 文末可以加我們粉絲群 面向初學者的機器學習課程 ML for beginners banner 地址&#xff1a;https://microsoft.github.io/ML-For-Beginners/#/ 學習經典…

[Linux] Web基礎知識與http協議

一、HTML 1.1 HTML 的概念 HTML被稱為超文本標記語言。 它是規范和標準. 它通過標記符號來標記網頁中出現的各個部分。網頁文件本身就是一種文本文件。 通過向文本文件添加標記&#xff0c;您可以告訴瀏覽器如何顯示其中的內容。 HTML命令可以描述文本、圖形、動畫、聲音、表格…

講解把一個文件夾里面的內容復制到另一個文件夾中的操作

&#x1f38a;專欄【Java小練習】 &#x1f354;喜歡的詩句&#xff1a;天行健&#xff0c;君子以自強不息。 &#x1f386;音樂分享【如愿】 &#x1f384;歡迎并且感謝大家指出小吉的問題&#x1f970; 文章目錄 &#x1f354;需求?思路?代碼?效果 &#x1f384;如果要復制…

Vue3:表格單元格內容由:圖標+具體內容 構成

一、背景 在Vue3項目中&#xff0c;想讓單元格的內容是由 &#xff1a;圖標具體內容組成的&#xff0c;類似以下效果&#xff1a; 二、圖標 Element-Plus 可以在Element-Plus里面找是否有符合需求的圖標iconfont 如果Element-Plus里面沒有符合需求的&#xff0c;也可以在這…

MySQL 數據庫操作指南:LIMIT,OFFSET 和 JOIN 的使用

限制結果 您可以通過使用"LIMIT"語句來限制查詢返回的記錄數量。以下是一個示例&#xff0c;獲取您自己的Python服務器中"customers"表中的前5條記錄&#xff1a; import mysql.connectormydb mysql.connector.connect(host"localhost",user&…

Proteus仿真--基于NM24C08的EEPROM仿真設計

本文介紹基于NM24C08的EEPROM仿真設計&#xff08;完整仿真源文件及代碼見文末鏈接&#xff09; 其中NM24C08是標準的2線總線接口的串行EEPROM&#xff0c;開機畫面在LCD12864上顯示 仿真圖如下 仿真運行視頻 Proteus仿真--基于NM24C08的EEPROM仿真設計 附完整Proteus仿真資料…

零一萬物模型折騰筆記:官方 Yi-34B 模型基礎使用

當爭議和流量都消失后&#xff0c;或許現在是個合適的時間點&#xff0c;來拋開情緒、客觀的聊聊這個 34B 模型本身&#xff0c;尤其是實踐應用相關的一些細節。來近距離看看這個模型在各種實際使用場景中的真實表現和對硬件的性能要求。 或許&#xff0c;這會對也想在本地私有…

Docker本地部署Drupal內容管理框架并實現公網遠程訪問

文章目錄 前言1. Docker安裝Drupal2. 本地局域網訪問3 . Linux 安裝cpolar4. 配置Drupal公網訪問地址5. 公網遠程訪問Drupal6. 固定Drupal 公網地址7. 結語 前言 Dupal是一個強大的CMS&#xff0c;適用于各種不同的網站項目&#xff0c;從小型個人博客到大型企業級門戶網站。它…

bat腳本之findstr

findstr 是 Windows 操作系統中用于文本搜索的命令&#xff0c;它可以在文件中查找指定的字符串或正則表達式&#xff0c;并輸出匹配的行或行號。findstr 命令可以在命令提示符下直接使用&#xff0c;也可以在批處理腳本中嵌套使用。 以下是 findstr 命令的基本語法&#xff1…

使用條件格式突出顯示單元格數據-sdk

使用條件格式突出顯示單元格數據 2023 年 12 月 6 日 根據數據值將視覺提示應用于特定單元格、行或列&#xff0c;從而更輕松地識別模式和趨勢。 網格中的條件格式允許用戶根據單元格或范圍包含的數據將視覺樣式應用于單元格或范圍。它通過以數據驅動的方式突出顯示關鍵值、異常…

【基于Python的二手車數據可視化平臺的設計與實現】

基于Python的二手車數據可視化平臺的設計與實現 前言數據獲取與處理網絡爬蟲數據存儲 可視化平臺的設計與實現Flask框架數據可視化 創新點結語 前言 隨著社會的不斷發展&#xff0c;二手車市場也逐漸成為一個備受關注的領域。為了更好地為二手車的買家和賣家提供信息&#xff…

Python 實現全連接攻擊-1

實現或討論如何實現網絡攻擊&#xff0c;包括全連接攻擊&#xff08;一種形式的拒絕服務攻擊&#xff09;&#xff0c;是不合適的&#xff0c;也違反了倫理和法律規定。無論是學術研究、安全測試還是其他目的&#xff0c;未經授權對網絡或系統進行攻擊都是非法和不道德的。 如…

計算和傳輸背后的時空觀

吞吐和速度(率)經常被混淆&#xff0c;當提到 100Gbps 網卡時&#xff0c;“它很快” 的意義可能只是 “它很多” 100Gbps 指 1s 內發送的比特數為 100G&#xff0c;如果在這 1s 內塞入更多比特&#xff0c;以下是兩種方式&#xff1a; 顯然&#xff0c;上面是更多&#xff…

安全防御–

安全防御 ASPF技術## FTP協議主機之間傳輸文件是IP網絡的一個重要功能&#xff0c;如今人們可以方便地使用網頁、郵箱進行文件傳輸。然而在互聯網早期&#xff0c;Web&#xff08;World Wide Web&#xff0c;萬維網&#xff09;還未出現&#xff0c;操作系統使用命令行的時代&a…

iOS分段控件UISegmentedControl使用

在故事板中添加UISegmentedControl 具體添加步聚如下: 選擇Xcode的View菜單下的Show Library (或者Shift+Common+L) 打開控件庫如下 在控件庫中輸入seg搜索控件,在出現Segmented Control后,將其拖到View Controller Scene中 到這里,添加分段控件UI已完成, 接下來將控件與變量…

shell的變量

Linux 系統中 shell 變量的使用 文章目錄 &#xff08;1&#xff09;簡介&#xff08;2&#xff09;變量分類&#xff08;3&#xff09;變量賦值&#xff08;4&#xff09;變量命名&#xff08;5&#xff09;變量引用&#xff08;6&#xff09;變量清除&#xff08;7&#xff0…

基于JavaWeb+SSM+Vue馬拉松報名系統微信小程序的設計和實現

基于JavaWebSSMVue馬拉松報名系統微信小程序的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 Lun文目錄 1系統概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系統設計思想 1 2相關技術 2 2.…