4種分布式session解決方案

cookie和session的區別和聯系

cookie是本地客戶端用來存儲少量數據信息的,保存在客戶端,用戶能夠很容易的獲取,安全性不高,存儲的數據量小
session是服務器用來存儲部分數據信息,保存在服務器,用戶不容易獲取,安全性高,儲存的數據量相對大,存儲在服務器,會占用一些服務器資源,但是對于它的優點來說,這個缺點可以忽略了

session有什么用

在一次客戶端和服務器為之間的會話中,客戶端(瀏覽器)向服務器發送請求,首先cookie會自動攜帶上次請求存儲的數據(JSESSIONID)到服務器,服務器根據請求參數中的JSESSIONID到服務器中的session庫中查詢是否存在此JSESSIONID的信息,如果存在,那么服務器就知道此用戶是誰,如果不存在,就會創建一個JSESSIONID,并在本次請求結束后將JSESSIONID返回給客戶端,同時將此JSESSIONID在客戶端cookie中進行保存

客戶端和服務器之間是通過http協議進行通信,但是http協議是無狀態的,不同次請求會話是沒有任何關聯的,但是優點是處理速度快

session是一次瀏覽器和服務器的交互的會話,當瀏覽器關閉的時候,會話就結束了,但是會話session還在,默認session是還保留30分鐘的

分布式session一致性

客戶端發送一個請求,經過負載均衡后該請求會被分配到服務器中的其中一個,由于不同服務器含有不同的web服務器(例如Tomcat),不同的web服務器中并不能發現之前web服務器保存的session信息,就會再次生成一個JSESSIONID,之前的狀態就會丟失

4種分布式session解決方案

方案一 客戶端存儲

直接將信息存儲在cookie中
cookie是存儲在客戶端上的一小段數據,客戶端通過http協議和服務器進行cookie交互,通常用來存儲一些不敏感信息

缺點

  • 數據存儲在客戶端,存在安全隱患
  • cookie存儲大小、類型存在限制
  • 數據存儲在cookie中,如果一次請求cookie過大,會給網絡增加更大的開銷

方案二 session復制

session復制是小型企業應用使用較多的一種服務器集群session管理機制,在真正的開發使用的并不是很多,通過對web服務器(例如Tomcat)進行搭建集群。

存在的問題

  • session同步的原理是在同一個局域網里面通過發送廣播來異步同步session的,一旦服務器多了,并發上來了,session需要同步的數據量就大了,需要將其他服務器上的session全部同步到本服務器上,會帶來一定的網路開銷,在用戶量特別大的時候,會出現內存不足的情況

優點

  • 服務器之間的session信息都是同步的,任何一臺服務器宕機的時候不會影響另外服務器中session的狀態,配置相對簡單
  • Tomcat內部已經支持分布式架構開發管理機制,可以對tomcat修改配置來支持session復制,在集群中的幾臺服務器之間同步session對象,使每臺服務器上都保存了所有用戶的session信息,這樣任何一臺本機宕機都不會導致session數據的丟失,而服務器使用session時,也只需要在本機獲取即可

如何配置
在Tomcat安裝目錄下的config目錄中的server.xml文件中,將注釋打開,tomcat必須在同一個網關內,要不然收不到廣播,同步不了session
在web.xml中開啟session復制:<distributable/>

方案三 session綁定:

Nginx介紹
Nginx是一款自由的、開源的、高性能的http服務器和反向代理服務器

Nginx能做什么
反向代理、負載均衡、http服務器(動靜代理)、正向代理

如何使用nginx進行session綁定
我們利用nginx的反向代理和負載均衡,之前是客戶端會被分配到其中一臺服務器進行處理,具體分配到哪臺服務器進行處理還得看服務器的負載均衡算法(輪詢、隨機、ip-hash、權重等),但是我們可以基于nginx的ip-hash策略,可以對客戶端和服務器進行綁定,同一個客戶端就只能訪問該服務器,無論客戶端發送多少次請求都被同一個服務器處理

在nginx安裝目錄下的conf目錄中的nginx.conf文件

upstream aaa {Ip_hash;server 39.105.59.4:8080;Server 39.105.59.4:8081;
}
server {listen 80;server_name www.wanyingjing.cn;#root /usr/local/nginx/html;#index index.html index.htm;location / {proxy_pass http:39.105.59.4;index index.html index.htm;}
}

缺點

  • 容易造成單點故障,如果有一臺服務器宕機,那么該臺服務器上的session信息將會丟失
  • 前端不能有負載均衡,如果有,session綁定將會出問題

優點

  • 配置簡單

方案四 基于redis存儲session方案

基于redis存儲session方案流程示意圖
在這里插入圖片描述
引入pom依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-data-starter-redis</artifactId>
</dependency>

配置redis

#redis數據庫索引(默認是0)
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#默認密碼為空
spring.redis.password=
#連接池最大連接數(負數表示沒有限制)
spring.redis.jedis.pool.max-active=1000
#連接池最大阻塞等待時間(負數表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
#連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=10
#連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=2
#連接超時時間(毫秒)
spring.redis.timeout=500ms

優點

  • 這是企業中使用的最多的一種方式
  • spring為我們封裝好了spring-session,直接引入依賴即可
  • 數據保存在redis中,無縫接入,不存在任何安全隱患
  • redis自身可做集群,搭建主從,同時方便管理

缺點

  • 多了一次網絡調用,web容器需要向redis訪問

總結
一般會將web容器所在的服務器和redis所在的服務器放在同一個機房,減少網絡開銷,走內網進行連接


---------------------
作者:斷橋殘雪
來源:CSDN
原文:https://blog.csdn.net/qq_35620501/article/details/95047642
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

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

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

相關文章

L2-020. 功夫傳人

一門武功能否傳承久遠并被發揚光大&#xff0c;是要看緣分的。一般來說&#xff0c;師傅傳授給徒弟的武功總要打個折扣&#xff0c;于是越往后傳&#xff0c;弟子們的功夫就越弱…… 直到某一支的某一代突然出現一個天分特別高的弟子&#xff08;或者是吃到了靈丹、挖到了特別的…

找數組里沒出現的數

題目&#xff1a;給定整數的數組&#xff0c;其中1≤A [1]≤ N&#xff08;N數組的大小&#xff09;&#xff0c;一些元素出現兩次以及其他出現一次。找到不出現在這個數組中的[1&#xff0c;n ]包含的所有元素。 思路&#xff1a;map的思想。。。。 public List<Integer>…

Blazor University (43)JavaScript 互操作 —— 類型安全

原文鏈接&#xff1a;https://blazor-university.com/javascript-interop/calling-dotnet-from-javascript/type-safety/類型安全在從 JavaScript 調用 .NET[1] 部分中&#xff0c;您可能已經注意到我們的 JavaScript 的第 6 行在將隨機生成的數字傳遞給 .NET 之前調用了 toStr…

分享 60 個神級 VS Code 插件

文章來源&#xff1a;juejin.cn/post/6994327298740600839 本文不做任何編輯器的比較&#xff0c;只是我本人日常使用 vscode 進行開發&#xff0c;并且比較喜歡折騰 vscode &#xff0c;會到處找這一些好玩的插件&#xff0c;于是越攢越多&#xff0c;今天給大家推薦一下我收…

URL結構分析

http://bh-lay.com/blog/14b531db64a

PHP 基礎篇 - PHP 中 DES 加解密詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、簡介 DES 是對稱性加密里面常見一種&#xff0c;全稱為 Data Encryption Standard&#xff0c;即數據加密標準&#xff0c;是一種使用密鑰加密的塊算法。密鑰長度是64位(bit)&#xff0c;超過位數密鑰被忽略。所謂對…

PerfView專題 (第一篇): 如何尋找熱點函數

一&#xff1a;背景 準備開個系列來聊一下 PerfView 這款工具&#xff0c;熟悉我的朋友都知道我喜歡用 WinDbg&#xff0c;這東西雖然很牛&#xff0c;但也不是萬能的&#xff0c;也有一些場景他解決不了或者很難解決&#xff0c;這時候借助一些其他的工具來輔助&#xff0c;是…

3四則運算軟件2016011992

使用JAVA編程語言&#xff0c;獨立完成一個3到5個運算符的四則運算練習的命令行軟件開發 基本功能要求&#xff1a; 程序可接收一個輸入參數n&#xff0c;然后隨機產生n道加減乘除&#xff08;分別使用符號-*來表示&#xff09;練習題&#xff0c;每個數字在 0 和 100 之間…

JAVA高并發多線程必須懂的50個問題

下面是Java線程相關的熱門面試題&#xff0c;你可以用它來好好準備面試。 1) 什么是線程&#xff1f; 線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位。程序員可以通過它進行多處理器編程&#xff0c;你可以使用…

Centos7設置IP為固定值

1.進入到系統的IP地址保存文件所在目錄 [rootlocalhost ~]# cd /etc/sysconfig/network-scripts 2.修改保存IP信息的文件 [rootlocalhost ~]# vim ifcfg-eth0 &#xff08;你機器上的名字有可能不是這個&#xff0c;但是是以ifcfg-eth開頭的文件&#xff09; 保存后退出 3.重啟…

為 EditorConfig 文件開啟錯誤編譯失敗

前言上次&#xff0c;我們介紹了 EditorConfig 文件可以自定義代碼樣式規則。但是&#xff0c;當我們想設置代碼樣式嚴重性&#xff0c;比如不允許編譯成功時&#xff0c;又踩了不少坑。修改無效想把 var 首選項&#xff0c;從“首選"var" 僅重構”&#xff0c;改成“…

【.NET特供-第三季】ASP.NET MVC系列:傳統WebForm站點和MVC站點執行機制對照

本文以圖形化的方式&#xff0c;從‘執行機制’方面對照傳統WebForm站點和MVC站點。請參看下面圖形&#xff1a; 一、執行機制 當我們訪問一個站點的時候&#xff0c;瀏覽器和server都是做了哪些動作呢&#xff1f; &#xff08;本文僅僅是提供一個簡單的執行過程&#xff0c;有…

hdoj1045 Fire Net(二分圖最大匹配)

題意&#xff1a;給出一個圖&#xff0c;其中有 . 和 X 兩種&#xff0c;. 為通路&#xff0c;X表示墻&#xff0c;在其中放炸彈&#xff0c;然后炸彈不能穿過墻&#xff0c;問你最多在圖中可以放多少個炸彈&#xff1f; 這個題建圖有點復雜orz。 建圖&#xff0c;首先把每一行…

c++的命名空間

一.C的命名原則namespace是指標識符的各種可見范圍&#xff0c;c的所有標識符都被定義在一個名為std的namespace中。1.<iostream>和<iostream.h>是兩個不同的文件&#xff0c;后綴為.h的頭文件c標準已經明確提出不支持了&#xff0c;早些的實現將標準庫功能定義在全…

投阿里被拒,說跳槽太頻繁!三年兩個工作,問題真的那么大嗎?

什么樣的跳槽頻率才不算頻繁&#xff1f;一位網友發問&#xff1a;投阿里被拒&#xff0c;理由是跳槽太頻繁&#xff0c;不合適。三年兩個工作&#xff0c;問題真的那么大嗎&#xff1f;網友說&#xff0c;阿里對穩定性要求非常高&#xff0c;三年兩跳和五年三跳都是紅線&#…

Linux下防御DDOS攻擊的操作梳理

DDOS的全稱是Distributed Denial of Service&#xff0c;即"分布式拒絕服務攻擊"&#xff0c;是指擊者利用大量“肉雞”對攻擊目標發動大量的正常或非正常請求、耗盡目標主機資源或網絡資源&#xff0c;從而使被攻擊的主機不能為合法用戶提供服務。 DDOS攻擊的本質是…

為什么信息化 ≠ 數字化?終于有人講明白了

作者&#xff1a;石秀峰 來源&#xff1a;談數據&#xff08;ID&#xff1a;learning-bigdata&#xff09; 近期&#xff0c;我一做數字化咨詢的朋友&#xff08;化名老王&#xff09;遇到了一個頭痛的問題&#xff1a;話說老王的團隊近期接了一個大單——一大型制造業的數字化…

JAVA代碼—算法基礎:數獨問題(Sodoku Puzzles)

JAVA代碼—算法基礎&#xff1a;數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨游戲&#xff08;日語&#xff1a;數獨 すうどく&#xff09;是一種源自18世紀末的瑞士的游戲&#xff0c;后在美國發展、并在日本得以發揚…

Linux系統恢復

實驗目的&#xff1a;熟悉了前面的啟動流程&#xff0c;系統的一個大致的啟動流程是怎樣的&#xff0c;而其中牽扯到了些許文件&#xff0c;這些文件在系統啟動時用于銜接各個步驟&#xff0c;如果這些文件損壞或缺失&#xff0c;系統將不能正常啟動&#xff0c;這次寫的內容就…

PerfView專題 (第二篇):如何尋找 C# 中的 Heap堆內存泄漏

一&#xff1a;背景 上一篇我們聊到了如何去找 熱點函數&#xff0c;這一篇我們來看下當你的程序出現了 非托管內存泄漏 時如何去尋找可疑的代碼源頭&#xff0c;其實思路很簡單&#xff0c;就是在 HeapAlloc 或者 VirtualAlloc 時做 Hook 攔截&#xff0c;記錄它的調用棧以及分…