
SERVICE PHONE
363050.com发布时间:2025-07-01 04:26:02 点击量:
哈希游戏,哈希博彩平台,比特币哈希游戏,区块链博彩,去中心化博彩平台,可验证公平平台,首存送88U,虚拟币哈希娱乐《详解Golang官方中的一致性哈希组件》:本文主要介绍了Golang官方中的一致性哈希组件的相关知识,详细内容请阅读本文,希望能对你有所帮助...
在分布式缓存中,我们需要通过一组缓存节点来提高我们的缓存容量。比如我们有3个Redis节点:
最简单的路由规则是我们计算`Key`的哈希值,然后取模计算目标节点,比如我们有5个Key,计算出以下哈希值及对应的目标节点:
可以看到,我们只是加入了一个节点,就导致了所有Key的目标节点被改变了,这样会导致大量缓存失效,这时请求可能就会都打到数据库里,可能会导致数据库被击垮,这也就是缓存雪崩问题。
一致性哈希算法经常被用于请求路由中,在处理节点不变的情况下,它能够把相同的请求路由到相同的处理节点上。同时还能在处理节点变动时,让相同请求尽可能的打到原先相同的处理节点上。
一致性哈希的原理是把处理节点通过哈希映射到一个哈希环上,哈希环可以理解为一个连续编号的循环链表,一般会使用长度为32位的哈希值,也就是哈希环可以映射2^32个值。如下图所示:
图中有三个Redis节点,通过哈希映射到环上的某个位置。Key也是通过哈希映射到环上的某个位置,然后向前寻找计算节点,第一个遇到的就是Key的目标节点。
这时候如果我们加入一个新的Redis3节点,可以看到只有Key4的路由改变了,其他的Key的路由都保持不变:
可以看到上面的Redis节点在环上分布得并不均匀,这样会导致每个节点的负载差距过大。为了让Redis节点在环上分布得更加均匀,我们还可以再加入虚拟节点。让一个Redis节点能够映射到哈希环上的多个位置,这样节点的分布会更加均匀。
可以看到因为每个Redis节点的映射位置变多了,因此更有可能会分布得更加均匀。图里每个Redis节点只有两个虚拟节点,主要是不太好画,实际上我们可能会给每个Redis节点分配几十个虚拟节点,这样基本上就很均匀了。
golang官方的groupcache库是一个嵌入式的分布式缓存库,它里面有一个一致性哈希的实现:
第一件需要做的事情,就是我们需要把节点进行哈希得到一个整数值,这里默认是使用crc32计算一个字节序列的哈希值,当然也可以自己指定。
哈希环的结构里面有一个ring数组,我们使用这个数组模拟一个哈希环,当然数组并不会把最后一个元素链接到第一个元素,因此我们需要在逻辑上模拟。里面的nodes则是保存了哈希值到真实节点字符串的映射js,这样我们在ring数组里面找到对应的哈希值时才能反过来找到真实节点。
可以看到这个方法是把节点添加到哈希环里面,这里会为每个节点创建虚拟节点,这样可以分布的更加均匀。
当然这个方法存在一个问题,就是它没有判断加入的节点是否已经存在,这样可能会导致Ring上面存在相同的节点。
为了解决上面的问题,我们额外实现了一个重置方法,也就是先清空哈希环,再添加。当然这样就必须每次都指定完整的节点列表。
这个方法的功能是查询Key应该路由到哪个节点,也就是计算Key的哈希值,然后找到哈希值对应的处理节点(这里需要考虑ring数组逻辑上是一个环),然后再根据这个哈希值去寻找真实处理节点的字符串。
这个一致性哈希的实现非常简单,功能上也非常简单(官方的实现甚至没有Reset()方法),可以通过这个实javascript现理解一致性哈希的原理。也可以直接在业务中使用它,如果功能不够再根据需求进行扩展。
到此这篇关于详解Golang官方中的一致性哈希组件的文章就介绍到这了,更多相关Golang一致性哈希内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
声明:凡注明本站原创的所有文字图片等资料,版权均属编程客栈所有,欢迎转载,但务请注明出处。
SpringBoot项目集成Swagger和swagger-bootstrap-ui及常用注解解读
PHP抽象工厂模式Abstract Factory Pattern优点与实现方式
Python爬虫之使用BeautifulSoup和Requests抓取网页数据
SpringCloud实现服务调用feign与熔断hystrix和网关gateway详细分析
编程客栈为广大编程爱好者、程序员提供专业且权威的编程教程,是您学习软件编程、网络编程、数据库、操作系统、程序设计、脚本、网页制作、建站技术、网站技巧、网络知识技术、CMS教程等必备网站,我们希望成为您心中理想的编程学习网站。