zoukankan      html  css  js  c++  java
  • Go实现一致性哈希

    一致性哈希主要在于节点的增删不会大面积的造成缓存穿透,也就是说请求方会微调而不是全调。

     学习自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

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    练习题
    java关键字
    循环结构
    第一天的学习
    爬虫的简单介绍
    Windows10 专业版秘钥激活
    flask补充
    Flask框架
    小程序登录、授权、支付
    赃读、不可重复读 和 幻读
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12459298.html
Copyright © 2011-2022 走看看