阅读目录:使用场景算法原理虚拟节点代码示例使用场景以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时。这时候就需要考虑进行缓存数据分片,也即是把100G的数据拆分成多块小于单机内存的数据。例如以10G为单位,拆分10份,存储到多 ...
阅读目录:
- 使用场景
- 算法原理
- 虚拟节点
- 代码示例
使用场景
以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时。这时候就需要考虑进行缓存数据分片,也即是把100G的数据拆分成多块小于单机内存的数据。例如以10G为单位,拆分10份,存储到多台机器节点上。 但是数据怎么个分法更合理呢? 、
f(key)%n
这里配置n=10,不同的key根据数值余数映射到对应的机器。 很简单的办法就解决了多台节点key分法的问题。然而数据大小的增长和缩减是很难预知的, 如果需要增加一台缓存服务器。 配置n=11,会发现之前根据余数建立的映射关系发生混乱。映射错乱后,就会发生大量key无法命中正确的节点,需要全部重新进行映射。 如果以后再添加节点,同样会遇到这样问题。
servers = ['redis:6379', 'redis:6380', 'redis:6381'] server = servers[f(key) % servers.length]
//下面f函数中先将servers与虚拟节点映射成 6379={6379A,6379B}, 6380={6380A,6380B},6381={6381A,6381B}
// 在对虚拟节点求各自的数值,而数值对应的还是物理节点。即:
vservers = f(servers) ={['redis:6379','100'],['redis:6379','300'] ....,['redis:6381',150]};CHash(key1)==102 ∈ vservers[0] ......CHash(key3)==350 ∈ vservers[1]
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:探索c#之一致性Hash详解
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。