単点redis障害なし自動転送redis


github転送ゲート:
https://github.com/chembohuang/no-single-point-of-failure-jedis
一、開発の初心:memcached無単点案は古すぎて、配置が複雑すぎる.その中でmemcachedに対する案の一つは日本人が開発したrepcachedですが、このプロジェクトは3年前に更新されていません.サポートされているmemcachedバージョンも比較的低いです.シナリオ2はmemcachedのエージェントmagentを使用することです.これはもっとでたらめで、4年も経っていないし、インストール構成が面倒で、障害が発生して再起動すると、古いデータが失われます.
そのため、このキャッシュに対してミドルウェアを書くことにしたが、新興のredisは性能的にmemcachedを爆発させ、使わないわけにはいかない.最終的なスキームはjedis(redisのjavaパッケージ)に基づいてapacheのcommon-pools 2と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);

上記のデフォルトは30分で失効するか、次のメソッドを呼び出してタイムアウト時間を追加します.
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のデフォルトの方法を使用し、他の方法、例えばfastjsonkryothriftなどに変更したい場合はjedisFacadeImplを変更します.JAvaの中の2つの方法でいいです.
4.プログラムはredisの主従関係を制御するので、インストール時にすべて独立した形式でインストールし、主従を配置しないでください.