原始碼分析:go-redis 叢集客戶端 key 路由的實現
阿新 • • 發佈:2021-10-25
原始碼:https://github.com/go-redis/redis/tree/v8.11.4
資料結構
flowchart LR subgraph clusterClient n["nodes *clusterNodes"] s["state *clusterState"] end subgraph sCNs["clusterNodes"] n2["nodes map[string]*clusterNode"] end subgraph sCS["clusterState"] s2["slots []*clusterSlot"] gg["generation uint32"] ct["createdAt time.Time"] end subgraph sCSt["clusterSlot"] se["start, end int"] n3["nodes []*clusterNode"] end subgraph sCN["clusterNode"] c["Client *Client"] g["generation uint32"] end n --> sCNs s --> sCS s2 --> sCSt n2 --> sCN n3 --> sCN gg -.- g- clusterClient:叢集客戶端抽象
- clusterNodes:維護叢集內「例項地址=>節點」的對映
- clusterState:維護叢集內「雜湊槽=>節點」的對映,建立後不可修改,只能通過新建替換更新,每次新建 generation 自增。createdAt 為建立時間。
- clusterSlot:一個範圍的雜湊槽以及負責這些槽的節點(第一個為主節點,其餘為從節點),start為起始雜湊槽編號,end為起結束希槽編號,nodes為負責這些槽的節點。
- clusterNode:叢集節點抽象。client為連線此節點的客戶端,generation與clusterState的generation關聯。