一致性hash简介
- 主要针对多cache的应用场景,当cache服务器变动时,希望cache中的信息尽可能被使用到;
- 需要做好负载均衡,同时不能因为添加和删除cache节点造成部分节点负载过重;
代码实现
1、类的定义
type SortedKeys []uint32
func (x SortedKeys) Len() int { return len(x) }
func (x SortedKeys) Less(i, j int) bool { return x[i] < x[j] }
func (x SortedKeys) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
type ConsistentHashing struct {
NumOfVirtualNode int
hashSortedKeys SortedKeys
circleRing map[uint32]string
dataSet map[string]bool
}
NumOfVirtualNode -- 虚拟节点可以保证数据的存储更加均衡;
hashSortedKeys -- 每个index存储的是(虚拟)节点通过hash函数映射到的值,该值的范围是(0 到 2的32次方减1)
circleRing -- 每个(虚拟)节点的hash映射值和节点名的对应关系;
dataSet -- 记录已经存储的节点
2、添加或删除node
func (c *ConsistentHashing) Add(node string) {
if _, find := c.dataSet