首页 > 编程知识 正文

redis实现分布式锁最好方案,java分布式任务队列

时间:2023-05-03 16:45:06 阅读:31993 作者:2652

在介绍redis分布式会话共享之前,我们将介绍tomcat的会话管理机制。 其中包括请求时的会话操作、会话id解析过程、servlet获取会话的过程以及tomcat的会话管理机制。

Tomcat会话管理机制

请求中的session操作:

请求进程首先解析请求中的会话id信息,然后将会话id存储在请求的参数列表中。 然后,在从请求获取会话时,如果存在会话id,则根据id从会话池获取会话,如果不存在会话id或者会话无效,则创建新的会话

sessionid分析过程(在web项目中部署tomcat jar包可以调试错误) :

用户将http请求发送到http处理器,并通过http处理器解析封装到org.apache.coyote.Request中,然后传递到CoyoteAdapter。 Coyote适配器是适配器。 将封装了coyote框架的org.apache.coyote.Request与org.Apache.catalina.connector.request相适应,并在转换后将其转换为parsePathParameters 这是从cookie解析sessionid后请求存在。 分析会话id后进入请求,分析会话id的逻辑即可。

servlet获取会话的过程:

servlet通过请求获取会话时,实际上是http servlet请求(实际上是请求facade,封装了请求门)。 然后RequestFacade真正调用request的getSession方法request的具体逻辑是调用Context容器的getManger方法来获取session管理器, 如果sessionid已解析,则必须调用findSession方法从session对象池中检索对应的session,相反,如果sessionid不存在,则必须重新创建session

会话管理机制:

essionmanager组件负责管理会话对象。 eg :常规管理和销毁session对象

)1) Manager )定义用于管理与一个容器相关联的会话池的基本接口。

)2) manager base :实现了提供session manager常规功能实现的manager界面。

(3)标准管理器)是从ManagerBase,tomcat继承的默认Session管理器(在默认情况下使用它,而不指定配置),它由tomcat处理Session

(4) PersistentManagerBase )从ManagerBase继承,实现并定义了session manager持久化的基础功能。

)5)持续管理器:继承自持续管理器,主要实现将空闲会话对象(通过设置超时时间)交换到磁盘的功能。

)6)集群管理器:实现了管理器界面。 应该可以从类名推测出来。 这是一个相对于管理群集会话的管理器和上面的标准管理器独立会话管理器的概念。 此类定义了群集到群集会话的复制共享接口。

)7)集群管理器:实现集群管理器接口,从管理器基础继承。 此类提供了session复制的基本操作。

)8) BackupManager )实现从群集管理器库继承的群集到会话复制策略。 会话数据只有一个备份节点,该备份节点的位置对于群集中的所有节点可见。 这种设计具有支持异构环境的优点。

)9) DeltaManager )从群集管理器数据库继承的群集构建会话复制策略的实现。 与BackupManager不同,会话数据复制到群集中的所有成员节点上,因此群集中的所有节点必须相同,并且必须部署相同的APP应用程序。

Redis分布式会话配置

分布式会话原理

如上图所示,可以在多个实例中使用redis来实现分布式session管理,通过客户端请求、负载均衡后分发到tomcat实例,通过session管理,实现redis中session的访问配置redis主从群集,主redis数据热备份到从redis,主redis停机时

,系统自动切换至从redis,从而保证系统缓存方面高可用。

一言不合上代码,就是任性...

redis配置

可以使用spring-redis.xml作为redis配置文件名,首先配置redis缓存池:

再配置redis模板引擎redisTemplat:

```

配置分布式session过滤器

springSessionFilter

org.springframework.web.filter.DelegatingFilterProx

targetBeanName

springSession

web.xml中配置分布式session过滤器,初始化bean name是springSession;将需要用到分布式session请求配置至过滤器中,代码如下:

springSessionFilter

/shoppingcart/*

springSessionFilter

/my/*

redis session配置

配置分布式session管理bean(SessionRepositoryFilter.java),经过第二步过滤器的请求,都会经过这个管理bean,配置SessionRepositoryFilter.java默认构造函数是redis session操作仓RedisOperationsSessionRepository.java。

p:port="${redis.port.session}"p:hostName="${redis.host.session}"

p:password="${redis.password.session}" p:poolConfigref="jedisPoolConfig" />

redis如何实现session分布式存取在下一节介绍。

分布式session请求流程

上一节介绍了spring mvc框架下redis session系统配置管理,下面我将会redis中session请求流程进行介绍。

如上一节所述,经过过滤器的请求,进入SessionRepositoryFilter,其默认使用RedisOperationsSessionRepository作为构造函数参数。

默认使用RedisOperationsSessionRepository作为构造函数参数

进入分布式session过滤器,SessionRepositoryFilter执行doFilterInternal方法,类似Filter中的doFilter(),在单个请求线程中只调用一个请求。doFilterInternal()执行doFilter操作后,再执行session commit操作wrappedRequest.commitSession();

commitSession.png

commitSession方法中,sessionRepository.save(session)调用RedisOperationsSessionRepository的save()方法,将session以key value形式存放到redis中。

获取session时,SessionRepositoryFilter调用getSession()方法,方法内部S session = sessionRepository.getSession(requestedSessionId);调用RedisOperationsSessionRepository的getSession()方法,从redis中获取session。具体RedisOperationsSessionRepository如果将session存取值redis,不再讲述,可以查阅源码。

尊重版权:

参考文档:Tomcat中session的管理机制

博主知识短浅,如有错误疏漏,请各位简客批评指正。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。