深入剖析Tomcat会话机制

本文深入探讨了Tomcat的会话缓存机制,包括默认的内存存储和 PersistentManager 结合不同 Store(如Redis)的实现。文章通过源码分析了Session何时会被换出或备份,提出简单和最终两种切换方案,以实现更有效的Session管理,特别是介绍了开源项目 tomcat-redis-session-manager 如何实现Session与Redis的无缝集成。
摘要由CSDN通过智能技术生成

 

1缓存机制

Tomcat默认将Session保存到内存中。但同时,Tomcat也提供了PersistentManager配合不同的Store实现的方式,使Session可以被保存到不同地方(Database,Redis,Memcached等)。 

例如下面的配置:

         <ManagerclassName="org.apache.catalina.session.PersistentManager"
                   debug="0"
                   saveOnRestart="true"
                   maxActiveSession="-1"
                   minIdleSwap="0"
                   maxIdleSwap="0"
                   maxIdleBackup="-1">
                   <StoreclassName="com.cdai.test.RedisStore" host="192.168.1.1"port="6379"/>
         </Manager>

通过PersistentManager配合RedisStore,实现了Session存储到Redis中。但要注意的是:切换Manager和Store实现都不会让Session全部保存到其他位置。

Tomcat只是在下面三种情况会将Session通过Store保存起来:

Ø  当Session的空闲时间超过minIdleSwap和maxIdleSwap时,会将Session换出

Ø  当Session的空闲时间超过maxIdleBackup时,会将Session备份出去

Ø  当Session总数大于maxActiveSession时,会将超出部分的空闲Session换出

 

所以只是简单地切换Manager和Store的实现,并不能使Tomcat把Session都保存到我们想要的地方。Tomcat还是会把内存当做Session的主存储器,我们配置的Store只是作为辅助存储器。 下面先来深入研究下Tomcat源码来研究下Session管理机制,最后我们再看下如何能达到我们想要的效果。


2深入源码

2.1使用Session

下面以一个使用Session的Servlet为切入点,开始分析Tomcat源码。

public class LoginServletextends HttpServlet {
 
    private static int i = 0;
 
    @Override
    protected void service(HttpServletRequestreq, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session =req.getSession(true);
        System.out.println(session.getAttribute("cdai"));
        session.setAttribute("cdai","helloworld" + i++);
    }
 
}

默认配置下,我们通过HttpServletRequest得到的HttpSession实现是StandardSession。设置属性时,只是把属性值保存到StandardSession的一个Map中。

 

2.2后台线程

在Tomcat 6中所有后台线程的调度都是在ContainerBase.backgroundProcess()中统一处理的。

    public void backgroundProcess() {
       
        if (!started)
            return;
 
        if (cluster != null) {
            try {
                cluster.backgroundProcess();
            } catch (Exception e) {
               log.warn(sm.getString("containerBase.backgroundProcess.cluster",cluster), e);               
            }
        }
        if (load
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值