一、开发初衷:memcached 无单点方案过于陈旧,配置过于复杂。其中针对memcached的方案一是日本人开发的repcached,但这个项目差不多三年前就没有更新过了。支持的memcached版本也比较低。方案二是使用memcached的代理magent,这个就更离谱了,差不多4年没人理过了,而且安装配置麻烦,在出现故障重启时,旧数据还会丢失。
因此决定针对此缓存自写一个中间件,而新兴的redis在性能上又完爆memcached,没有不用的道理。最终的方案便于基于jedis(redis 的java 封装),使用apache的common-pools2和jdk的序列化反序列化通过程序的控制做到缓存的实时备份,故障自动切换,心跳监测功能。
二、使用方法(基于spring容器):
1.将代码打成jar包,引入所需工程,另外加依赖:
redis.clients jedis 2.4.1 org.ow2.asm asm-util 4.0 cglib cglib 3.0
2.xml配置:
3.使用前注入该实例:
@Autowired private FailoverJedisPool jedisPool;
4.set对象进去redis:
jedisPool.getJedis().saveOrUpdate("myKey", someSerializeObject);
上面默认是半个小时失效,或者调用以下方法添加超时时间:
jedisPool.getJedis().saveOrUpdate("myKey", someSerializeObject,60*30);
5.从redis取对象:
SomeSerializeObject g = jedisPool.getJedis().getValue("myKey", SomeSerializeObject.class);
三、需要注意的是:
1.不要缓存jedisFacade这个实例,使用时先从jedisPool 取出来:
jedisPool.getJedis(),因为这是池里的对象,用完后是要还回去的,实例通过cglib代理,用完后自动还了。
2.基于最新的jedis 2.4.1。
3.序列化与反序列化这块使用的是jdk默认的方式,如果想换成其它方式例如:fastjson\kryo\thrift等等,改jedisFacadeImpl.java里面两个方法即可。
4.程序控制redis的主从关系,所以你安装时全部以独立形式安装,也不要配主从。