redis實作session共享的方法是什麼
引言
大廠很多專案都是部署到多台伺服器上,這些伺服器在各個地區都存在,當我們訪問服務時雖然執行的是同一個服務,但是可能是不同伺服器運行的;
在我學習專案時遇到這樣一個登入情景,假設有如下三台伺服器(如圖),就使用session存放使用者的登入信息,透過該資訊可以判斷使用者是否登入:
假設本次登入是透過伺服器01執行的,那麼這次的登入session資訊就存放到了記憶體01中;但是當我再次造訪時卻是伺服器02執行操作,而登入session資訊卻在記憶體01中,伺服器02無法獲取,所以它就會判斷我沒有登錄,回傳錯誤的資訊…
我們想要實現的就是透過一台伺服器登入所產生的session可以和其他伺服器共用,那麼該如何實現?
解決方法 想法就是既然這幾個伺服器自己的記憶體不能共享,那麼只要有一個共享空間供這幾個伺服器共同存取不就可以了(如圖);
首先想到的應該是資料庫,只要這些伺服器叢集共用一個資料庫,並且把產生的session資訊存放到資料庫中不就可以了,這樣大家都可以存取;資料庫有關聯式和非關係型(NoSql):
關係型資料庫:Mysql等
非關係型資料庫:Redis(K /V資料庫)等
這裡其實選擇非關係型資料庫最好,因為Redis基於內存,讀寫效能高,很適合這種使用者資訊頻繁讀取的情況;
還可以透過檔案伺服器實現,這裡就不介紹了;
還有一種方法,可以透過nginx的iphash實現,非常簡單,但是思路和上面兩種不同,原理就是同一個ip的所有請求都會被nginx進行iphash進行計算,將結果綁定到指定伺服器,之後這個請求都會被存取到該伺服器。
但是這樣就有一些問題,首先就算負載平衡就沒有太大意義了,如果綁定的伺服器掛了,那麼iphash也就失效了;又或者你的請求被其他服務分發而未走nginx服務,那麼iphash同樣不生效;所以謹慎使用;
下面我就簡單透過程式碼模擬一下如何透過redis配置輕鬆實現session共享
案例介紹
這裡有一個使用者管理項目,登入邏輯代碼會記錄下來登入使用者的session資訊:
然後同時開啟了該項目的兩個服務:localhost:8080和localhost :8082(可以當作兩台不同伺服器上執行的專案)
#開啟服務後可以存取對應的介面文件:
#-------------------------------------------------分割線-------- -----------------------------------
該服務都有以下兩個介面:(以下測試是在同一個服務中測試的)
登入介面:記錄登入使用者session資訊
登入測試:
取得目前使用者資訊介面:透過登入session取得目前使用者資訊
取得目前登入用戶資訊測試:
因為現在這是兩個服務,所以肯定實作不了共享session的,就算在8080埠的服務登入了,也無法在8082埠的服務取得到目前使用者資訊;(再次強調:上面測試可以取得到目前使用者資訊是因為在同一個服務中測試的,同一個服務session存放到他自己的記憶體當然可以自己存取了)
具體操作
下面就透過redis配置實現共享session:
首先要下載redis,下載網路上找教學;這裡我直接用的在伺服器上透過docker建立的redis容器(簡單好用,強烈建議):
透過視覺化工具可以連接一下:
這樣redis就配置好了,下面在專案程式碼中配置redis:
在專案中引入redis依賴和spring-session設定依賴(自動將session 儲存到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相關設定:
spring: # session配置 session: timeout: 86400 # 设置session失效时间 store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键) # redis配置 redis: port: 8081 # redis的端口号(这里是我的redis容器在docker中对应的端口号) host: xx.xxx.xxx.xxx # 我的云服务器ip database: 0 # 设置存入redis的哪一个库(默认是0)
其實關鍵設定就一個: store-type: redis,只要配置了這個,那麼程式碼中session就會存放到redis中而不是自己的記憶體中;
接下來就可以測試了:
呼叫登入接口,生成用戶session信息,查看redis:
可以看到用戶登錄session已經存放到redis中了,這樣我在8080端口登錄,在8082也可以獲得登入的session資訊:
登入:
取得資訊:
這樣就透過redis實作session共享了;
需要注意:引入redis和spring-redis依賴版本需要接近。
以上是redis實作session共享的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信
