一致性哈希主要在于节点的增删不会大面积的造成缓存穿透,也就是说请求方会微调而不是全调。
学习自https://geektutu.com/post/geecache-day4.html
package consistenthash import ( "hash/crc32" "sort" "strconv" ) type Hash func(data []byte) uint32 type Map struct { hash Hash replicas int keys []int hashMap map[int]string } func New(replicas int, fn Hash) *Map { m := &Map{ replicas: replicas, hashMap: make(map[int]string), hash: fn, } if m.hash == nil { m.hash = crc32.ChecksumIEEE } return m } func (m *Map) Add(keys ...string) { for _, key := range keys { for i := 0; i < m.replicas; i++ { hash := int(m.hash([]byte(strconv.Itoa(i) + key))) m.keys = append(m.keys, hash) m.hashMap[hash] = key } } sort.Ints(m.keys) } func (m *Map) Get(key string) string { if len(m.keys) == 0 { return "" } hash := int(m.hash([]byte(key))) idx := sort.Search(len(m.keys), func(i int) bool { return m.keys[i] >= hash }) return m.hashMap[m.keys[idx%len(m.keys)]] }
end