標籤:ssh mod 串連 緩衝 except idle 記憶體 obj 實現
經過我們團隊的一番討論,終於決定使用redis來進行我們的業務緩衝。redis會將資料緩衝到記憶體中,執行效率會非常快。同一時候非同步將資料寫入到磁碟中。進行持久化。
且redis支援主從同步,支援分布式部署,支援N多資料結構,這對於我們有著莫大的吸引力。
參見:http://blog.csdn.net/yichenlian/article/details/27207383
我們團隊討論的焦點是在於redis的災備恢複問題。
因為redis的持久化是非同步。總會有一點時間記憶體中資料和磁碟資料不同步的情況(當然能夠設定成全然同步。那麼用redis的意義就大打折扣了)。儘管沒有找到盡善盡美的解決的方法。只是有一些網上的處理方式還是能夠接受的。
參見:http://blog.csdn.net/xiangliangyu/article/details/8165644
隨後我使用javaclientJedis對redis相關操作進行了一些系統的簡單的封裝。使用的是jedis的分布式串連池,這樣方便於redis橫向擴充,添加高可用性。封裝思路:首先定義串連池類,封裝串連池擷取方式;對外為介面。介面定義的是redis常規操作,定義的方法基本與redis中一致,而且使用介面便於擴充;實現介面,我封裝的實作類別僅僅使用了分布式的方式(即ShardedJedis),也能夠使用別的實現方式,能夠自己擴充。
1.擷取串連池:
簡單配置JedisPoolConfig
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(maxTotal);//the max number of connectionjedisPoolConfig.setMaxIdle(maxIdle);//the max number of freejedisPoolConfig.setMaxWaitMillis(maxWaitMillis);//the longest time of waiting
設定JedisShardInfo(redis.clients.jedis.JedisShardInfo.JedisShardInfo(String host, int port))
得到ShardedJedisPool(串連池):redis.clients.jedis.ShardedJedisPool.ShardedJedisPool(GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards,Hashing algo)
這樣就得到了串連池。
2.定義介面,簡單為上:
public interface JedisClientInterface {/** * 寫入一般的string類型的value * * @param key * @param value */void put(String key, String value);/** * 讀取String類型的value * * @param key * @return */String get(String key);}
3.完畢實作類別:
public class JedisClientShardImpl implements JedisClientInterface {@Overridepublic void put(String key, String value) {boolean flag = true;ShardedJedis shardedJedis = pool.getResource();try{if(shardedJedis!=null){shardedJedis.set(key, value);}}catch(Exception e){flag = false;e.printStackTrace();}finally{if (flag){ pool.returnResource(shardedJedis); }else{ pool.returnBrokenResource(shardedJedis); }}}@Overridepublic String get(String key) {boolean flag = true;ShardedJedis shardedJedis = pool.getResource();try{if(shardedJedis!=null){return shardedJedis.get(key);}}catch(Exception e){flag = false;e.printStackTrace();}finally{ if (flag){ pool.returnResource(shardedJedis); }else{ pool.returnBrokenResource(shardedJedis); } } return null; }}
至此,整個封裝流程就走通了。
能夠隨意向下擴充了。
redis的javaclientJedis簡單封裝