首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

改善基于filter的远程分布式session存储

2012-11-03 
改进基于filter的远程分布式session存储!--StartFragment-- ?参考了网上一些资料,实现了session通过filt

改进基于filter的远程分布式session存储

<!--StartFragment-->

?

参考了网上一些资料,实现了session通过filter存储到memcached服务器上.

(参见: http://ooft.iteye.com/blog/537841 )

实现方式:

a)????通过MemcachedSessionFilter过滤器拦截cookie,取得的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用.

b)????继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现.

c)????SessionService连接memcached服务,以sessionId作为key,存取的对象是一个map.map的内容即为session的内容.

d)????读取数据时,先通过sessionId从memcached服务器上获取整个map对象,再以session的attributeName作为key从map中获取数据对象.写数据的方式与读数据类似,先获取map,然后修改map中的值,然后将整个map保存到memcached服务器上.

改进内容:

?

1 楼 colorless 2009-12-21   很好的思路。

可以有效避免tomcat集群的时候需要做session复杂产生的效率低下的问题,特别是点很多的时候。 2 楼 colorless 2009-12-21   不知道实际环境有没有比较好的应用? 3 楼 colorless 2009-12-21   每次一个map放memcache上,是不是数据量太大了? 4 楼 colorless 2009-12-21   引用public static synchronized XSessionService getInstance() {
if (instance == null) {
instance = new XSessionService();
}
return instance;
}


看了楼主的代码,其中这段做同步好像也不好,会有严重并发问题吧? 5 楼 colorless 2009-12-21   还有cookie中保存的sid是不是永远不过期的,这样会不会造成这个用户每次上来都是同一个sid,不管是今天还是明天访问。这个也是一个很大的安全隐患吧? 6 楼 neptune 2009-12-22   java中很多人都想过用memcached存储session,可session过期你如何解决呢? 7 楼 hxpterry 2009-12-22   虽然memcache也有过期时间,但假如web服务器重启了,memcache中的数据还在,的确是个问题,曾经我们的项目中也曾考虑过用memcache做集群中的session,但最后还是取消了。 8 楼 langshao 2009-12-22   在HttpSession的实现中,换成RMI远程调用Session服务器上相应的方法,会不会可以避免对Session的操作传输可能很大的Map呢?
如果请求到达之后可以忽略此后其他请求对Session的更新,那么可以再在本地缓存此Session,当然这样的话对Session的更新就要同时对本地缓存Session以及Session服务器上的进行更新。这里要权衡Session的大小以及对Session的访问程度等。
对于Session服务器上的并发问题,只要在更新时锁住要更新的Session就可以了,没必要锁整个方法。
并且session服务器上的程序可以维护一个session的最后访问时间,超时了就将其清出。

PS:用不用memcache就不说了,没研究过。 9 楼 neptune 2009-12-22   每次web访问都要记录访问时间,服务器必死! 10 楼 langshao 2009-12-22   其实这个Date就可以记录在Session的某个key中,服务器会挂??
11 楼 neptune 2009-12-23   langshao 写道其实这个Date就可以记录在Session的某个key中,服务器会挂??

请问你的这个Date(访问时间)记录在那呀,是在Memcached吗?有空看看Tomcat的SessionImpl吧,因为要实现Session超时功能,你要每次访问服务器都记录本次访问时间,相当于每次访问服务器必访问一次Memcached,而不是每次访问Session那么简单。

热点排行