Redis回顧java
原理以下所示:git
特性github
基本原理以下所示:
redis
特性算法
基本原理以下所示:spring
Twemproxy高可用部署架構數據庫
redis的管道(Pipelining)操做是一種異步的訪問模式,一次發送多個指令,不一樣步等待其返回結果。這樣能夠取得很是好的執行效率。調用方法以下:後端
@Test public void testPipelined() { Jedis jedis = new Jedis("localhost"); Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("p" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); }
Gossip 算法又被稱爲反熵(Anti-Entropy),熵是物理學上的一個概念,表明雜亂無章,而反熵就是在雜亂無章中尋求一致,這充分說明了 Gossip 的特色:在一個有界網絡中,每一個節點都隨機地與其餘節點通訊,通過一番雜亂無章的通訊,最終全部節點的狀態都會達成一致。每一個節點可能知道全部其餘節點,也可能僅知道幾個鄰居節點,只要這些節能夠經過網絡連通,最終他們的狀態都是一致的,固然這也是疫情傳播的特色。
簡單的描述下這個協議,首先要傳播謠言就要有種子節點。種子節點每秒都會隨機向其餘節點發送本身所擁有的節點列表,以及須要傳播的消息。任何新加入的節點,就在這種傳播方式下很快地被全網所知道。這個協議的神奇就在於它從設計開始就沒想到信息必定要傳遞給全部的節點,可是隨着時間的增加,在最終的某一時刻,全網會獲得相同的信息。固然這個時刻可能僅僅存在於理論,永遠不可達。
查詢路由的流程以下所示:數組
Redis cluster採用這種架構的考慮:緩存
- 減小redis實現的複雜度
- 下降客戶端等待的時間。Smart client能夠在客戶端緩存 slot 與 redis節點的映射關係,當接收到 MOVED 響應時,會修改緩存中的映射關係。請求時會直接發送到正確的節點上,減小一次交互。
遷移過程以下所示:
遷移過程當中,Codis-dashboard與proxy經過zk通訊,路由表信息所有存放在zk,保證全部proxy的視圖一致。
Codis如何保證數據遷移過程的正確及透明?
對比參數 | Codis | Redis-cluster |
---|---|---|
Redis版本 | 基於2.8分支開發 | >= 3.0 |
部署 | 較複雜。 | 簡單 |
運維 | Dashboard,運維方便。 | 運維人員手動經過命令操做。 |
監控 | 可在Dashboard裏監控當前redis-server節點狀況,較爲便捷。 | 不提供監控功能。 |
組織架構 | Proxy-Based, 類中心化架構,集羣管理層與存儲層解耦。 | P2P模型,gossip協議負責集羣內部通訊。去中心化 |
伸縮性 | 支持動態伸縮。 | 支持動態伸縮 |
主節點失效處理 | 自動選主。 | 自動選主。 |
數據遷移 | 簡單。支持透明遷移。 | 須要運維人員手動操做。支持透明遷移。 |
升級 | 基於redis 2.8分支開發,後續升級不能保證;Redis-server必須是此版本的codis,沒法使用新版本redis的加強特性。 | Redis官方推出,後續升級可保證。 |
可靠性 | 通過線上服務驗證,可靠性較高。 | 新推出,坑會比較多。遇到bug以後須要等官網升級。 |
- 理論上,redis-cluster的性能更高,單次請求的延時低。另外,通過實測,兩種架構後端單臺redis-server的條件下,TPS基本沒有差異。
- Codis的高可用依賴jodis,或者使用LVS進行高可用部署。
壓測結論