基于kryo序列化方案的memcached-session-manager多memcached节点配置 memcachedwicketWebCSS
更新:
现在做分布式解决方案一般都是基于cookie不开启HttpSession来实现的,当时是因为单机系统已经开发好了后面为了方便水平扩展而选择了memcached-session-manager,这几天碰巧又用到了这个,发现最新的稳定版本1.8.3已经很方便的可以使用kryo来做序列化了,这里贴一个我现在用的单机Memcached的配置
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:127.0.0.1:11211" sticky="false" lockingMode="auto" memcachedProtocol="binary" sessionBackupAsync="false" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
新版本不需要以前的一些比如cglib-nodep-2.2.jar等包了,具体可自行参考官网的配置
另外说一句,本来是打算用tomcat-redis-session-manager的,后来发现这货实现的方案还是有bug的,比如在spring mvc中使用RedirectAttributes.addFlashAttribute会发现这方法无效,换了它官方说明的Persistence Policies都不行,也不打算替他修正了,直接换久经考验的方式。
----------------------------------------------------------分界线-----------------------------------------------------------------
上次基于Java IO的序列化方案配置了memcached-session-manager,但是性能不好,现在先简单配置成基于kryo的
<Context path="/mobilemail" docBase="D:\webapp\WebRoot" reloadable="true"> <Manager className= "de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes= "n1:192.168.112.1:11211,n2:192.168.112.2:11211" sticky="false" lockingMode="auto" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" memcachedProtocol="binary" copyCollectionsForSerialization="true" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" customConverter="org.claros.commons.CustomKryoRegistration" /> </Context>
注意customConverter配置的com.test.serializer.CustomKryoRegistration这个类是自己写的类,是用来注册一些特殊类型的,同时自己负责对这些类型的序列化,可以放在项目里,也可以单独打个jar包,把以后遇到的所有复杂类型都在这里即可。项目里遇到的kryo没有注册到的类就是session里的java.util.concurrent.ConcurrentHashMap这个类,反序列化的时候本来可以做得更高效些,这里只是为了演示,直接用kryo自带的MapSerializer来反序列化
package com.test.serializer; import java.util.concurrent.ConcurrentHashMap; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.serialize.MapSerializer; import de.javakaffee.web.msm.serializer.kryo.KryoCustomization; public class CustomKryoRegistration implements KryoCustomization { public void customize(Kryo kryo) { kryo.register(ConcurrentHashMap.class, new MapSerializer(kryo)); } }