分布式缓存Redis

分布式Session

2024-05-22 03:48:42

业务背景

web应用中,为了应对大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一,weblogic tomcat等多数主流web服务器都采用了session复制以及实现session的共享. 但问题是很明显的:在节点持续增多的情况下,session复制带来的性能损失会快速增加。特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著。这种特性使得web应用的水平扩展受到了限制。session共享的另一种思路就是把session集中起来管理,首先想到的是采用数据库来集中存储session,但数据库是文件存储相对内存慢了一个数量级,同时这势必加大数据库库系统的负担。并且session里面的数据结构是MAP类型,和分布式缓存的MAP数据结构天然匹配。

业务要求

良好的扩展性,100个节点以上web服务器;

Session操作的性能能横向扩展,容量横向扩展;

共享session数据支持超时机制

需求分析

天翼云分布式缓存单分组支持1000web服务器*100个线程以上的连接池连接、后端redis存储节点支持1000redis节点水平扩展,存储容量最大可支持500TB、支持按key设置超时时间

实现思路:通用实现思路,与web容器选型无关

1. 使用filter拦截cookie中的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用;

2. 继承重构HttpServletRequestWrapperHttpSessionWrapper类,覆盖原来和session存取相关的方法,都通过SessionService类来实现;

3. 使用HttpSessionSidWrapper实现httpsession接口,对容器的session的属性存取操作进行包装;

4. Session对象 map<Stringobject>,缓存中是 map<String,byte[]>,需要把session中的object序列化成byte[]


Vk8MzZ02eEPi