多台服务器分布式集群导至前后台交互session会有获取错乱问题,通过memcached服务器做为缓存服务器,即可解决相关问题,以下经过本人多次试验后成功实现session存储,总结如下:
一.环境
1. Linux 环境
2. Tomcat6.0 (4台)
3. memcached 一台(缓存1服务器:172.18.2.14,默认端口11211)
memcached 相关命令:
1、检查进程
ps -ef|grep memcached
注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包(之前试了多个版本,特别注意),截图中jar包本人已成功试用
1.这是采用的最新稳定版1.6.1,序列化方式使用的是kryo,注意版本要求与msm版本基本一致,建议统一采用最新稳定版,其中序列化方式是可选的。具体jar包见同文件夹下
有多种序列化方式,建议采用kryo序列化方式,效率更高。(之前试了javolution方式、java序列化方式都未成功,可能是jar包版本有问题)
二.配置
1. 将对应的jar包全部拷贝到tomcat的lib下(四台tomcat都需要)
2.修改每台tomcat的conf目录下得context.xml文件,在其中加入如下任意一段代码(注意:当使用多台tomcat时,一定要使用non-sticky模式)
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.18.2.14:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
sticky 可选项,默认为true。
指定使用粘性的还是非粘性的Session机制,这里使用的是非粘性。
lockingMode 可选项, 此属性只对非粘性Session有用,默认为none。
指定非粘性Session的锁定策略。他的只有
(1)、none:从来不加锁
(2)、all: 当请求时对Session锁定,直到请求结束
(3)、auto:对只读的request不加锁,对非只读的request加锁
(4)、uriPattern:<regexp>: 使用正则表达式来比较requestRUI + "?" + queryString来决定是否加锁,
sessionBackupAsync 可选项,默认true
指定Session是否应该被异步保存到Memcached中。
如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout
设置的过期时间起作用。
sessionBackupTimeout 可选项,默认100
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒
注意:存入session的对象要序列化,存在memcached中的要在HTML展示的list也要序列化后才能读取(可以考虑改存json格式或者直
接HTML格式试试,网上也有说用redis可以处理)