shardedjedis是用來作redis分片集羣的方式之一,根據redis key經過一致性哈希算法找到選擇操做的redis服務分片。它是基於apache的開源項目通用對象管理池實現的,須要時從pool中獲取,用完時放回到pool中(詳情見http://www.cnblogs.com/chenjian5/p/5149312.html )。html
在官方的實現中有一個問題當一個jedis(tcp client)建立鏈接失敗或鏈接失效時拋異常(心跳檢查或者使用時檢查),池對象會被銷燬,致使另外一個正常的jredis(tcp client)也一塊被銷燬了。同理若是一個redis服務分片掛掉全部的池對象到該redis分片服務的jedis(tcp client) 都不可用以致於全部的池對象都被銷燬。進而致使整個集羣不可用。git
所以本項目( https://git.oschina.net/zhanggaofeng/redis-proxy )針對該問題進行二次開發,池對象建立鏈接失敗或鏈接失效拋異常時(心跳檢查或者使用時檢查),不會被銷燬並加入到一個失效節點集合中,利用redis心跳檢查(配置必須開啓)失效節點和失效節點恢復(從失效節點中移除)。每次操做獲取時首先判斷根據key獲取的jedis是否失效並快速失敗返回(由於每次jedis操做前會判斷tcp是否鏈接並嘗試鏈接,每次回耗時很長特別是redis服務分片掛的時候),達到快送響應的目的。
增長redis鏈接失效和恢復報警。redis