无单点redis 故障自动转移redis

github 传送门:[url]https://github.com/chembohuang/no-single-point-of-failure-jedis[/url]

一、开发初衷:memcached 无单点方案过于陈旧,配置过于复杂。其中针对memcached的方案一是日本人开发的repcached,但这个项目差不多三年前就没有更新过了。支持的memcached版本也比较低。方案二是使用memcached的代理magent,这个就更离谱了,差不多4年没人理过了,而且安装配置麻烦,在出现故障重启时,旧数据还会丢失。
因此决定针对此缓存自写一个中间件,而新兴的redis在性能上又完爆memcached,没有不用的道理。最终的方案便于基于jedis(redis 的java 封装),使用apache的common-pools2和jdk的序列化反序列化通过程序的控制做到缓存的实时备份,故障自动切换,心跳监测功能。

二、使用方法(基于spring容器):
1.将代码打成jar包,引入所需工程,另外加依赖:
	<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-util</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.0</version>
</dependency>


2.xml配置:

<!-- jedis configuration starts-->
<bean id="config" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
<property name="maxTotal" value="200"></property>
<property name="maxIdle" value="50"></property>
<property name="minIdle" value="10"></property>
<property name="maxWaitMillis" value="15000"></property>
<property name="lifo" value="true"></property>
<property name="blockWhenExhausted" value="true"></property>
<property name="testOnBorrow" value="false"></property>
<property name="testOnReturn" value="false"></property>
<property name="testWhileIdle" value="false"></property>
<property name="timeBetweenEvictionRunsMillis" value="30000"></property>
</bean>

<bean id="jedisCluster" class="com.csair.wx.cache.redis.FailoverJedisCluster" init-method="init">
<property name="redisServers" value="10.92.2.61:6379,10.92.2.60:6379" />
</bean>

<bean id="jedisPool" class="com.csair.wx.cache.redis.FailoverJedisPool">
<constructor-arg type="org.apache.commons.pool2.impl.GenericObjectPoolConfig" ref="config" />
<constructor-arg type="com.csair.wx.cache.redis.FailoverJedisCluster" ref="jedisCluster" />
<constructor-arg type="org.apache.commons.pool2.impl.AbandonedConfig" ref="abandonConfig" />
</bean>

<bean id="abandonConfig" class="org.apache.commons.pool2.impl.AbandonedConfig">
<property name="removeAbandonedTimeout" value="10"></property>
<property name="removeAbandonedOnBorrow" value="true"></property>
<property name="removeAbandonedOnMaintenance" value="true"></property>
</bean>

<bean class="com.csair.wx.cache.redis.util.SpringContextutil" />
<!-- jedis configuration ends-->

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的主从关系,所以你安装时全部以独立形式安装,也不要配主从。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值