溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis實(shí)現(xiàn)session共享的方法是什么

發(fā)布時(shí)間:2023-04-15 14:00:42 來源:億速云 閱讀:90 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“redis實(shí)現(xiàn)session共享的方法是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“redis實(shí)現(xiàn)session共享的方法是什么”文章能幫助大家解決問題。

引言

大廠很多項(xiàng)目都是部署到多臺(tái)服務(wù)器上,這些服務(wù)器在各個(gè)地區(qū)都存在,當(dāng)我們?cè)L問服務(wù)時(shí)雖然執(zhí)行的是同一個(gè)服務(wù),但是可能是不同服務(wù)器運(yùn)行的;

在我學(xué)習(xí)項(xiàng)目時(shí)遇到這樣一個(gè)登錄情景,假設(shè)有如下三臺(tái)服務(wù)器(如圖),就使用session存放用戶的登錄信息,通過該信息可以判斷用戶是否登錄:

redis實(shí)現(xiàn)session共享的方法是什么

假設(shè)本次登錄是通過服務(wù)器01執(zhí)行的,那么這次的登錄session信息就存放到了內(nèi)存01中;但是當(dāng)我再次訪問時(shí)卻是服務(wù)器02執(zhí)行操作,而登錄session信息卻在內(nèi)存01中,服務(wù)器02無法獲取,所以它就會(huì)判斷我沒有登錄,返回錯(cuò)誤的信息…

我們想要實(shí)現(xiàn)的就是通過一臺(tái)服務(wù)器登錄所生成的session可以和其他服務(wù)器共享,那么該如何實(shí)現(xiàn)?

解決方法 思路就是既然這幾個(gè)服務(wù)器自己的內(nèi)存不能共享,那么只要有一個(gè)共享空間供這幾個(gè)服務(wù)器共同訪問不就可以了(如圖);

redis實(shí)現(xiàn)session共享的方法是什么

首先想到的應(yīng)該就是數(shù)據(jù)庫,只要這些服務(wù)器集群共享一個(gè)數(shù)據(jù)庫,并把生成的session信息存放到數(shù)據(jù)庫中不就可以了,這樣大家都可以訪問;數(shù)據(jù)庫有關(guān)系型和非關(guān)系型(NoSql):

這里其實(shí)選擇非關(guān)系型數(shù)據(jù)庫最好,因?yàn)镽edis基于內(nèi)存,讀寫性能高,很適合這種用戶信息頻繁讀取的情況;

還可以通過文件服務(wù)器實(shí)現(xiàn),這里就不介紹了;

還有一種方法,可以通過nginx的iphash實(shí)現(xiàn),該方法非常簡單,但是思路和上面兩種不同,原理就是同一個(gè)ip的所有請(qǐng)求都會(huì)被nginx進(jìn)行iphash進(jìn)行計(jì)算,將結(jié)果綁定到指定服務(wù)器,之后這個(gè)請(qǐng)求都會(huì)訪問到該服務(wù)器中。
但是這樣就有一些問題,首先就算負(fù)載均衡就沒有太大意義了,如果綁定的服務(wù)器掛了,那么iphash也就失效了;又或者你的請(qǐng)求被其他服務(wù)分發(fā)而未走nginx服務(wù),那么iphash同樣不生效;所以謹(jǐn)慎使用;

下面我就簡單通過代碼模擬一下如何通過redis配置輕松實(shí)現(xiàn)session共享

案例介紹

這里有一個(gè)用戶管理項(xiàng)目,在登錄時(shí)登錄邏輯代碼會(huì)記錄下來登錄用戶的session信息:

redis實(shí)現(xiàn)session共享的方法是什么

然后同時(shí)開啟了該項(xiàng)目的兩個(gè)服務(wù):localhost:8080和localhost:8082(可以當(dāng)作兩臺(tái)不同服務(wù)器上運(yùn)行的項(xiàng)目)

redis實(shí)現(xiàn)session共享的方法是什么

開啟服務(wù)后可以訪問對(duì)應(yīng)的接口文檔:

redis實(shí)現(xiàn)session共享的方法是什么

-----------------------------------分割線-------------------------------------------

redis實(shí)現(xiàn)session共享的方法是什么

該服務(wù)都有以下兩個(gè)接口:(以下測(cè)試是在同一個(gè)服務(wù)中測(cè)試的)

登錄接口:記錄登錄用戶session信息

redis實(shí)現(xiàn)session共享的方法是什么

登錄測(cè)試:

redis實(shí)現(xiàn)session共享的方法是什么

獲取當(dāng)前用戶信息接口:通過登錄session獲取當(dāng)前用戶信息

redis實(shí)現(xiàn)session共享的方法是什么

獲取當(dāng)前登錄用戶信息測(cè)試:

redis實(shí)現(xiàn)session共享的方法是什么

因?yàn)楝F(xiàn)在這是兩個(gè)服務(wù),所以肯定實(shí)現(xiàn)不了共享session的,就算在8080端口的服務(wù)登錄了,也無法在8082端口的服務(wù)獲取到當(dāng)前用戶信息;(再次強(qiáng)調(diào):上面測(cè)試可以獲取到當(dāng)前用戶信息是因?yàn)樵谕粋€(gè)服務(wù)中測(cè)試的,同一個(gè)服務(wù)session存放到他自己的內(nèi)存中當(dāng)然可以自己訪問了)

具體操作

下面就通過redis配置實(shí)現(xiàn)共享session:

首先要下載redis,下載網(wǎng)上找教程;這里我直接用的在服務(wù)器上通過docker創(chuàng)建的redis容器(簡單好用,強(qiáng)烈推薦):

redis實(shí)現(xiàn)session共享的方法是什么

通過可視化工具可以連接一下:

redis實(shí)現(xiàn)session共享的方法是什么

這樣redis就配置好了,下面在項(xiàng)目代碼中配置redis:

在項(xiàng)目中引入redis依賴和spring-session配置依賴(自動(dòng)將 session 存儲(chǔ)到 redis 中):

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<version>2.6.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
	<version>2.6.3</version>
</dependency>

在application.yml文件中配置連接redis和session相關(guān)配置:

spring:
  # session配置
  session:
    timeout: 86400 # 設(shè)置session失效時(shí)間
    store-type: redis # 修改spring-session存儲(chǔ)配置,默認(rèn)存儲(chǔ)到服務(wù)器內(nèi)存中,現(xiàn)在設(shè)置存到redis中(關(guān)鍵)
  # redis配置
  redis:
    port: 8081 # redis的端口號(hào)(這里是我的redis容器在docker中對(duì)應(yīng)的端口號(hào))
    host: xx.xxx.xxx.xxx # 我的云服務(wù)器ip
    database: 0 # 設(shè)置存入redis的哪一個(gè)庫(默認(rèn)是0)

其實(shí)關(guān)鍵配置就一個(gè): store-type: redis,只要配置了這個(gè),那么代碼中session就會(huì)存放到redis中而不是自己的內(nèi)存中;

接下來就可以測(cè)試了:

調(diào)用登錄接口,生成用戶session信息,查看redis:

redis實(shí)現(xiàn)session共享的方法是什么

可以看到用戶登錄session已經(jīng)存放到redis中了,這樣我在8080端口登錄,在8082也可以獲取到登錄的session信息:

登錄:

redis實(shí)現(xiàn)session共享的方法是什么

獲取信息:

redis實(shí)現(xiàn)session共享的方法是什么

這樣就通過redis實(shí)現(xiàn)session共享了;

需要注意:引入redis和spring-redis依賴版本需要接近。

關(guān)于“redis實(shí)現(xiàn)session共享的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI