Redis集群原理详细分析
一致性哈希
节点的增加和减少,大部分节点的 Hash一致
package consistenthash import ( "hash/crc32" "sort" ) // HashFunc defines function to generate hash code type HashFunc func(data []byte) uint32 // NodeMap consistent hash hashFunc and you can pick node form NodeMap type NodeMap struct { hashFUnc HashFunc nodeHashs []int // sorted nodehashMap map[int]string // 通过节点 找到具体的hash 值 } func NewNodeMap(fn HashFunc) *NodeMap { nodeMap := &NodeMap{ hashFUnc: fn, nodehashMap: make(map[int]string), } // default func if nodeMap.hashFUnc == nil { nodeMap.hashFUnc = crc32.ChecksumIEEE } return nodeMap } func (m *NodeMap) IsEmpty() bool { return len(m.nodeHashs) == 0 } func (m *NodeMap) AddNode(keys ...string) { for _, key := range keys { if key == "" { continue } hash := int(m.hashFUnc([]byte(key))) m.nodeHashs = append(m.nodeHashs, hash) m.nodehashMap[hash] = key } sort.Ints(m.nodeHashs) } func (m *NodeMap) PickNode(key string) string { if m.IsEmpty() { return "" } hash := int(m.hashFUnc([]byte(key))) // Binary Search sorted hash idx := sort.Search(len(m.nodeHashs), func(i int) bool { return m.nodeHashs[i] >= hash }) if idx == len(m.nodeHashs) { idx = 0 } return m.nodehashMap[m.nodeHashs[idx]] }
Redis 集群
每个单机版本redis 有 standalone_database, 在其上在封装一个 cluster_database ,cluster_database 主要的功能是进行 集群之间的通信。
当某个节点被推选出 主节点后,需要将信息转发给其副的节点,在转发的过程中涉及到cluster的池化
go-commons-pool比较好使用的go的池化工具
各种命令方式
ping 不需要转发
get/set 通过一致性hash 转发到其他节点
flushdb: 全发方式 所有节点数据清空
到此这篇关于Redis集群原理详细分析的文章就介绍到这了,更多相关Redis集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
idea中使用maven archetype新建项目时卡住问题解决方案
这篇文章主要介绍了idea中使用maven archetype新建项目时卡住,解决本问题的方法,就是在maven的runner加上参数-DarchetypeCatalog=local就可以了,不需要下载xml文件再放到指定目录,需要的朋友可以参考下2023-08-08java基础之Collection与Collections和Array与Arrays的区别
这篇文章主要介绍了java基础之Collection与Collections和Array与Arrays的区别的相关资料,本文主要说明两者的区别以防大家混淆概念,需要的朋友可以参考下2017-08-08
最新评论