1. 程式人生 > >Apache shiro叢集實現 (八) web叢集時session同步的3種方法

Apache shiro叢集實現 (八) web叢集時session同步的3種方法

在做了web集群后,你肯定會首先考慮session同步問題,因為通過負載均衡後,同一個IP訪問同一個頁面會被分配到不同的伺服器上, 如果session不同步的話,一個登入使用者,一會是登入狀態,一會又不是登入狀態。所以本文就根據這種情況給出三種不同的方法來解決這個問題:


一,利用資料庫同步session

在做多伺服器session同步時我沒有用這種方法,如果非要用這種方法的話,我想過二種方法:

1,用一個低端電腦建個數據庫專門存放web伺服器的session,或者,把這個專門的資料庫建在檔案伺服器上,使用者訪問web伺服器時,會去這個專門的資料庫check一下session的情況,以達到session同步的目的。

2,這種方法是把存放session的表和其他資料庫表放在一起,如果mysql也做了叢集了話,每個mysql節點都要有這張表,並且這張session表的資料表要實時同步。

說明:用資料庫來同步session,會加大資料庫的負擔,資料庫本來就是容易產生瓶頸的地方,如果把session還放到資料庫裡面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正資料庫的負擔

二,利用cookie同步session

session是檔案的形勢存放在伺服器端的,cookie是檔案的形勢存在客戶端的, 怎麼實現同步呢?方法很簡單,就是把使用者訪問頁面產生的session放到cookie裡面,就是以cookie為中轉站。你訪問web伺服器A,產生了 session把它放到cookie裡面了,你訪問被分配到web伺服器B,這個時候,web伺服器B先判斷伺服器有沒有這個session,如果沒有, 在去看看客戶端的cookie裡面有沒有這個session,如果也沒有,說明session真的不存,如果cookie裡面有,就把cookie裡面的 sessoin同步到web伺服器B,這樣就可以實現session的同步了。

說明:這種方法實現起來簡單,方便,也不會加大資料庫的負擔,但是如果客戶端把cookie禁掉了的話,那麼session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。

三,利用Nosql資料庫redis或者memcache同步session

redis或memcache可以做分散式,如果沒有這功能,他也不能用來做session同步。他可以把web伺服器中的記憶體組合起來,成為一個"記憶體池",不管是哪個伺服器產生的sessoin都可以放到這個"記憶體池"中,其他的都可以使用。

優點:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。

缺點:redis或memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。

四,總結

上面三種方法都是可行的

第一種方法,最影響系統速度的那種,不推薦使用;

第二種方法,效果不錯,不過安全隱患一樣的存在;

第三種方法,個人覺得第三種方法是最好的,推薦大家使用,也印證了我的文章

相關推薦

Apache shiro叢集實現 web叢集session同步3方法

在做了web集群后,你肯定會首先考慮session同步問題,因為通過負載均衡後,同一個IP訪問同一個頁面會被分配到不同的伺服器上, 如果session不同步的話,一個登入使用者,一會是登入狀態,一會又不是登入狀態。所以本文就根據這種情況給出三種不同的方法來解決這個問題: 一,利用資料庫同步sessio

redis叢集實現redis+twemproxy叢集

redis的確是一個非常高效的快取伺服器,但是單臺redis伺服器的記憶體管理能力有限,如果一味的加大記憶體的話會導致redis伺服器的效能下降,所以就必須要搭建redis叢集來提供服務。在redis官方在3.0.0版本給出叢集方案之前,大部分的企業都使用twemproxy

Apache shiro叢集實現 shiro身份認證Shiro Authentication

<span style="font-size:18px;">package com.api6.shiro.demo1; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; impo

Apache shiro叢集實現 分散式集群系統下的高可用session解決方案---Session共享

      Apache Shiro的基本配置和構成這裡就不詳細說明了,其官網有說明文件,這裡僅僅說明叢集的解決方案,詳細配置:shiro web config     Apache Shiro叢集要解決2個問題,一個是session的共享問題,一個是授權

apache shiro叢集實現 session共享

    Apache Shiro的基本配置和構成這裡就不詳細說明了,其官網有說明文件,這裡僅僅說明叢集的解決方案,詳細配置:shiro web config     Apache Shiro叢集要解決2個問題,一個是session的共享問題,一個是授權資訊的cache共享問

Apache shiro叢集實現 shiro入門介紹

      近期在ITOO專案中研究使用Apache shiro叢集中要解決的兩個問題,一個是Session的共享問題,一個是授權資訊的cache共享問題,官網上給的例子是Ehcache的實現,在配置

linux伺服器centos7Apache+Tomcat 安裝配置以及叢集實現

解壓apr-1.5.2命令 [[email protected] ~]# tar zxvf apr-1.5.2.tar.gz 切換解壓目錄 [[email protected] ~]# cd apr-1.5.2 指令碼編譯配置指定安裝目錄 [[email protected] a

Apache Shiro 使用手冊Shiro架構介紹

springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 shiro kafka 一、什麽是Shiro Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能: 認證 - 用戶身份識別,常被稱為用戶“

Redis 設計與實現 --排序、慢查詢日誌、監視器

監視 strong add 2.4 bsp log 格式 sadd 請求 一、排序 SORT <key> 對一個數字值的key進行排序 1、alpha 對字符串類型的鍵進行排序 2、asc / desc   redis 默認升序排序asc

【轉】Verilog學習筆記簡單功能實現...............異步FIFO

另一個 gif 多個 可靠 基本原理 drs bar next 不同 基本原理: 1.讀寫指針的工作原理   寫指針:總是指向下一個將要被寫入的單元,復位時,指向第1個單元(編號為0)。   讀指針:總是指向當前要被讀出的數據,復位時,指向第1個單元(編號為0)

SpringBoot使用WebSocket實現服務端推送--叢集實現2

書接上文,本文介紹了一種實現叢集管理和訊息傳送方式。 在叢集模式情況下,一般是Nginx反向代理到多臺Tomcat或者SLB代理到多臺Tomcat的方式,怎麼實現給某個人推送訊息?比如WebSocket1連線到Tomcat1,但是在Tomcat2需要給WebSocket1傳送訊息,怎麼辦?一

Apache Shiro 許可權控制2

Shiro的 /WEB-INF目錄下的shiro.ini 配置檔案url匹配方式: ① ? 可以匹配一個字元   /admin?   ---->可以匹配到/admin1   /admin12匹配不到 ② * 

Apache Shiro 許可權認證1

Shiro的許可權認證 :   程式設計式授權 :                    

TCP/IP實現 插口層

一.概述         插口層可以說是在使用者程式與TCP/IP協議之間的一個呈上啟下的層次,它將使用者與某協議相關的請求對映到具體的協議實現。不同型別的套接字在產生時就會關聯到相關協議實現(通過一組函式指標來實現的)。比如在一個TCP套接字上

ORB-SLAM2從理論到程式碼實現:Tracking.cc程式詳解

本人郵箱[email protected],歡迎交流! 接著講tracking.cc。  bool Tracking::NeedNewKeyFrame() 函式功能 判斷是否需要生成新的關鍵幀,確定關鍵幀的標準 步驟 1. 在上一次進行重

redis叢集實現叢集刪除節點

redis叢集裡的節點支援動態刪除,但是一般情況下不會這麼做,只有在節點軟硬體升級的時候才會主動讓節點下線。刪除節點的方式就是redis-cli客戶端連線到伺服器,然後執行cluster forget node-id就可以了,如果是刪除一個從節點的話,叢集仍然是可用狀態,如

redis叢集實現 資料的和槽位的分配

不知道有沒有人思考過redis是如何把資料分配到叢集中的每一個節點的,可能有人會說,把叢集中的每一個節點編號,先放第一個節點,放滿了就放第二個節點,以此類推。。如果真的是這樣的話,伺服器的利用率和效能

Redis叢集常用命令、叢集節點新增刪除

一、cluster info :列印叢集資訊 二、cluster nodes:列出叢集中已知的所有節點(node),以及這些節點相關 資訊 可以看到上面有六個節點,三個主節點(master),三個備份節點(slave),其中有一個埠為7001的主節點前有mysel

redis叢集實現叢集新增節點

在redis-3.0.0裡,叢集新增節點是通過客戶端執行cluster meet命令來實現的,命令格式是cluster meet <ip> <port>,如果客戶端向A節點發送這條命令,ip和port分別是B節點的ip和port,就會把ip:port

微信小程式 蒐藏功能實現

搜尋功能用到了小程式的快取功能:wx.setStorage 如果沒有向用戶提供removeStorageSync或clearStorageSync,小程式的快取永久存在,沒有失效期,快取的最大不超過10MB 四類操作,八種方法: setStorage,getStorage