web服務器集羣(多臺web服務器)後session如何同步和共享

在訪問量上去之後,不少人會採用web集羣的方式在知足逐漸增加的用戶量。這時候就不得不面對一個問題,那就是在多個服務器下,每次請求都會由於負載均衡而分配到不一樣的服務器上。用戶在登陸服務器後,下一次請求被分配到另外一個服務器上,這時候session不一樣步,用戶就沒法繼續使用原先的session。下面我就聊聊如何解決這個問題。mysql

1、利用Mysql數據庫共享Session數據的方式web

使用一個mysql服務器作共享服務器,把全部的session的數據保存mysql服務器上,全部的web服務器都來這臺mysql服務器來獲取session數據。這裏有一個關鍵的地方,用來存放session的數據表不要跟其餘數據庫表放在一塊兒,要獨立開來,專門放在一個低端的服務器上面。否則,數據庫自己壓力就很大了,再加上session是須要頻繁的讀取的,這使得數據庫很容易達到瓶頸,從而致使太高的響應延遲。redis

2、利用cookie共享Session數據sql

當用戶請求後產生的session,咱們把他的sessionId和值都存在cookie裏面。這樣,當你訪問a服務器後,產生了session放在客戶端的cookie裏面,你在訪問被分配到b服務器上。這時候,b服務器先判斷自己服務器上有沒有這個用戶的session,若是沒有,在去看看客戶端的cookie裏面有沒有這個session,若是有,就獲取客戶端的這個cookie裏面的session。這樣就實現了session的同步。數據庫

3、使用內存來共享Session數據緩存

這裏建議能夠選擇採用開源的緩存系統來完成session的共享,好比memcache等。原理跟mysql同樣,無論哪一個服務器產生的session都放在一個"內存池"裏面。要獲取session數據的時候都統一到這裏獲取。我建議用這個方法。服務器

//使用當前sessionId 標識做爲key用來緩存當前用戶的userId,openId,
        // 防止用戶在使用過程當中切換網絡致使服務器切換跳404頁面
        String redisCurrentUserIdAndOpenIdKey = RedisUtil.getRedisCurrentUserIdAndOpenIdKey(request.getSession().getId());
        Map<String,String> currentUserIdAndOpenIdMap = new HashMap<String,String>();
        currentUserIdAndOpenIdMap.put(WebappCommonConstant.OPEN_ID, openId);
        currentUserIdAndOpenIdMap.put(WebappCommonConstant.USER_ID, String.valueOf(userId));
        redisBiz.insertMapToRedis(redisCurrentUserIdAndOpenIdKey,currentUserIdAndOpenIdMap,WebappCommonConstant.FREE_LOGIN_TIME);
相關文章
相關標籤/搜索