无单点redis 故障自动转移redis

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

一、开发初衷: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的主从关系,所以你安装时全部以独立形式安装,也不要配主从。


你可能感兴趣的:(redis,jedis,Failover,故障切换)