Tomcat中session共享問題的簡單解決辦法


tomcat-redis-session-manager

使用redis配置tomcat共享session

結構圖:

分析:

分布式web server集群部署后需要實現session共享,針對 tomcat 服務器的實現方案多種多樣,
比如 tomcat cluster session 廣播、nginx IP hash策略、nginx sticky module等方案,
本文主要介紹了使用 redis 服務器進行 session 統一存儲管理的共享方案。

必要環境:

  • java1.7
  • tomcat7
  • redis2.8

nginx 負載均衡配置

  1. 修改nginx conf配置文件加入

     upstream tomcat {
         server 200.10.10.67:8110;
         server 200.10.10.67:8120;
         server 200.10.10.44:8110;
         server 200.10.10.66:8110;
     }
    
  2. 配置 相應的server或者 location地址到 http://tomcat

tomcat session共享配置步驟

  1. 添加redis session集群依賴的jar包到 TOMCAT_BASE/lib 目錄下

  2. 修改 TOMCAT_BASE/conf 目錄下的 context.xml 文件

     	<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
     	<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
          host="localhost"
          port="6379"
          database="0"
          maxInactiveInterval="60"
          sessionPersistPolicies="PERSIST_POLICY_1,PERSIST_POLICY_2,.."
          sentinelMaster="SentinelMasterName"
          sentinels="sentinel-host-1:port,sentinel-host-2:port,.."/>
    

    屬性解釋:

    • host redis服務器地址

    • port redis服務器的端口號

    • database 要使用的redis數據庫索引

    • maxInactiveInterval session最大空閑超時時間,如果不填則使用tomcat的超時時長,一般tomcat默認為1800 即半個小時

    • sessionPersistPolicies session保存策略,除了默認的策略還可以選擇的策略有:

      [SAVE_ON_CHANGE]:每次 session.setAttribute() 、 session.removeAttribute() 觸發都會保存. 
      	注意:此功能無法檢測已經存在redis的特定屬性的變化,
      	權衡:這種策略會略微降低會話的性能,任何改變都會保存到redis中.
      
      [ALWAYS_SAVE_AFTER_REQUEST]: 每一個request請求后都強制保存,無論是否檢測到變化.
      	注意:對於更改一個已經存儲在redis中的會話屬性,該選項特別有用. 
      	權衡:如果不是所有的request請求都要求改變會話屬性的話不推薦使用,因為會增加並發競爭的情況。
      
    • sentinelMaster redis集群主節點名稱(Redis集群是以分片(Sharding)加主從的方式搭建,滿足可擴展性的要求)

    • sentinels redis集群列表配置(類似zookeeper,通過多個Sentinel來提高系統的可用性)

    • connectionPoolMaxTotal

    • connectionPoolMaxIdle jedis最大能夠保持idel狀態的連接數

    • connectionPoolMinIdle 與connectionPoolMaxIdle相反

    • maxWaitMillis jedis池沒有對象返回時,最大等待時間

    • minEvictableIdleTimeMillis

    • softMinEvictableIdleTimeMillis

    • numTestsPerEvictionRun

    • testOnCreate

    • testOnBorrow jedis調用borrowObject方法時,是否進行有效檢查

    • testOnReturn jedis調用returnObject方法時,是否進行有效檢查

    • testWhileIdle

    • timeBetweenEvictionRunsMillis

    • evictionPolicyClassName

    • blockWhenExhausted

    • jmxEnabled

    • jmxNameBase

    • jmxNamePrefix


  3. 重啟tomcat,session存儲即可生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM