首页 > 编程语言 >算法--hash取模

算法--hash取模

时间:2023-10-17 10:13:26浏览次数:31  
标签:取模 hash -- canister Canister Hash ID

一、简介

        hash取模算法常用于分布式缓存集群系统。一般3种:普通hash取模,一致性hash,hash槽。

        场景:用户注册系统,用户数量会不断的增大,需要几个服务器共同存储。

二、普通hash取模

       1、创建4个服务器【canister】,然后对注册的用户id hash取模。例如用户id是“matt”,先对“matt”做hash计算,假设得到值是17,拿这个hash对canister 个数进行取模:17 % 4 = 1,那么这个“matt”的用户就被分配到canister 1进行储存。再来一个用户,重复上一步骤,hash后得到23,那么取模后,分配到canister 3上,访问时也一样,先hash后求余数,再去对应的canister里面读取数据。    

  

      2、使用这种hash取模数算法有一个问题是,当4个canister都满了,如果想增加多一台canister,那么之前的关系就会被全部打乱,就代表着,存储过的数据通过hash索引就找不着位置了。只能全部迁移数据,重新建立关系。

  

 三、hash 环

        1、Hash 环可以解决动态扩容的问题,首先,在初始化的时候创建一个用户Canister,把Canister id 映射到Hash环上(Canister id Hash对2的32次方取余),然后把当前用户的ID的也映射到这个Hsah 环上(ID Hash 后对2的32次方取余)。当前只有一个Canister 1,那么所有Hash 环上映射的用户顺时针都找到该Canister里面。

     

 2、当Canister 1储存达到额定的容量的时候,动态创建一个Canister 2,也把Canister 2的ID hash后也映射到Hash环上,这时,Hash环上顺时针存储规则就要重新定义。

    

 3、这时要对所有存储的ID 进行计算,每个ID在计算Hash后会顺时针找到临接的存储节点存放。

这里会引起数据迁移,当只有一个Canister的时候,ID Hash 后顺时针所有临接点都是Canister 1,现在插入了Canister 2,那么原本存储在Canister 1里面的data index 1和data index 2就要迁移到Canister 2里面,这样在查询ID才能找到对应的Canister。
在查询数据时,也是按照PID hash后顺时针去找到临接的Caniste

        

 4、当Canister 2达到额定的容量时,再动态创建Canister 3,映射到Hash环上,重复上面的步骤对数据进行迁移。这样,每次在新增一个Canister之后,只会引起小量的数据迁移。如果下图,当增加了Canister后,把原本属于Canister 2的data index 1迁移到新新创建的Canister 3上,就能保证Hash环的插入和查找不会错乱。

        

 5、hash ring会出现一个问题是,hash倾斜,就是某个canister获取的顺时针很大,某个却佷小,就会出现,有的canister 存了很多数据,有的却没有存到多少数据,为了避免这个问题,就要建立很多个虚拟节点,来均分hash环的空间,虚拟节点所对应的数据再映射到真实节点上,以达到均分的效果。

      

 四、Hash slot

        1、hash 槽的原理跟hash ring差不多,只是hash 槽在初始状态下就确定了映射,Hash 槽计算方式:crc16(ID)% 16383 ,然后对应hash槽上的映射关系存储数据,当取模的值小于3000的时候,ID存储在canister 1上,当值大于30001并小于60000的时候,存储在canister 2上,以类推。

      

       2、新增canister 时,重新调整映射表,然后把数据迁移到对应的canister 上就可以了,hash slot 理论上出现hash倾斜的概率要小于hash ring。

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:取模,hash,--,canister,Canister,Hash,ID
From: https://www.cnblogs.com/xiaobaicai12138/p/17767792.html

相关文章

  • windows 11不能锁屏了, Win + L无反应
    windows10、windows11不能锁屏了,Win+L无反应您好,了解到您在使用时遇到问题。请您尝试分别按Win键和L键,查看是否有效。然后,请您打开开始,点击用户头像,查看有无锁定的选项。如果有,请尝试点击后能否锁屏。另外,请您尝试以下方法,查看能否解决问题。由于以下方法需要更改注......
  • leetcode200 岛屿数量
    链接https://leetcode.cn/problems/number-of-islands/description/思路跟岛屿周长差不多...但我觉得这个比岛屿周长还简单。不知道为什么这个算中等题目,岛屿周长算简单题目代码classSolution:defnumIslands(self,grid)->int:ifnotgridornotgrid[0]......
  • Vue性能优化--在Vue中,千万别用属性数组作为循环的对象
    在Vue中,千万别用属性数组作为循环的对象methods:{test(){...上面省略业务逻辑1万字 //16位像素数组letdcmbuffer=newUint16Array(dcmInfo._dictionary.dict["7FE00010"].Value[0]asArrayBuffer);this.currentImageInfo={......
  • 2-1.信息的存储
    信息存储虚拟内存空间是地址的集合字长\(w\_bit\)对应空间\((0,2^w-1)\)字节8bits位模式数据排布大/小端法布尔运算C中运算逻辑运算移位运算左移右移逻辑右移:无符号数算数右移:有符号数......
  • Prometheus监控RocketMQ
    本文基于官方提供的RocketMQExporter来监控RocketMQ集群1.BrokerTPS/QPS的监控2.消息积压监控3.消费组消费演示监控最终的Grafana面板效果图如下:楼主RocketMQ环境是三主三从集群(只要在其中一台部署监控即可)配置步骤1.安装RocketMQExporterRocketMQ官方已经提供了expor......
  • keep-alive实现tab标签页缓存
    标签页缓存 实现效果:已经打开的tab页签,再次访问不重新加载;关闭tab页签后再次访问,则重新加载实现技术:keep-alive组件的include属性指定页面缓存 一、修改Main.vue1、代码:<keep-alive  :include="cachPage">   <router-view></router-view></keep-alive> ......
  • CRM系统如何高效管理客户并为企业赋能?
     CRM客户管理系统对于企业管理者来说,已经不是陌生的词汇了。它是企业快速实现数字化转型的有效工具,让企业能够通过自动化的业务流程系统化客户管理、提高客户转化率。作为“客户管理系统”,CRM系统怎样管理客户并为企业赋能?一、数据分析提高转化率客户转化的前提是充分的认识......
  • 19 表单输入绑定
    <template><h3>表单输入绑定</h3><formaction=""><inputtype="text"v-model="message"><p>{{message}}</p></form></template><script>exportdefault{......
  • 初学Bokeh:【1】跬步
    初学Bokeh:【1】跬步Bokeh是一个交互式、可视化Python库。使用Bokeh可以快速、便捷地创建交互式绘图、仪表板和数据应用程序等相关应用。Bokeh库可以帮助用户构建复杂、绚丽的图形,是python数据可视化工具中的重要一员。从今天开始,随着对Bokeh的学习的逐步展开,本系列学习笔记中将......
  • 11_滑动窗口最大值
    滑动窗口最大值给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7]解释:滑动......