第六十九期: 漫画说算法之什么是一致性哈希?

当缓存集群的节点有所增加的时候,整个环形空间的映射仍然会保持一致性哈希的顺时针规则,所以有一小部分key的归属会受到影响。

作者:IT知识课堂来源

一年之前——

未来两年内,系统预估的总订单数量可达一亿条左右。

按Mysql单表存储500万条记录来算,暂时不必分库,单库30个分表是比较合适的水平分表方案。

于是小灰设计了这样的分表逻辑:

  1. 订单表创建单库30个分表
  2. 对用户ID和30进行取模,取模结果决定了记录存于第几个分表
  3. 查询时需要以用户ID作为条件,根据取模结果确定查询哪一个分表

分表方式如下图(为了便于描述,简化为5个分表):

过了两个月——

又过了半年多——

小灰的回忆告一段落——

1.首先,我们把全量的缓存空间当做一个环形存储结构。环形空间总共分成2^32个缓存区,在Redis中则是把缓存key分配到16384个slot。

2.每一个缓存key都可以通过Hash算法转化为一个32位的二进制数,也就对应着环形空间的某一个缓存区。我们把所有的缓存key映射到环形空间的不同位置。

3.我们的每一个缓存节点(Shard)也遵循同样的Hash算法,比如利用IP做Hash,映射到环形空间当中。

4.如何让key和节点对应起来呢?很简单,每一个key的顺时针方向最近节点,就是key所归属的存储节点。所以图中key1存储于node1,key2,key3存储于node2,key4存储于node3。

1.增加节点

当缓存集群的节点有所增加的时候,整个环形空间的映射仍然会保持一致性哈希的顺时针规则,所以有一小部分key的归属会受到影响。

有哪些key会受到影响呢?图中加入了新节点node4,处于node1和node2之间,按照顺时针规则,从node1到node4之间的缓存不再归属于node2,而是归属于新节点node4。因此受影响的key只有key2。

最终把key2的缓存数据从node2迁移到node4,就形成了新的符合一致性哈希规则的缓存结构。

2.删除节点

当缓存集群的节点需要删除的时候(比如节点挂掉),整个环形空间的映射同样会保持一致性哈希的顺时针规则,同样有一小部分key的归属会受到影响。

有哪些key会受到影响呢?图中删除了原节点node3,按照顺时针规则,原本node3所拥有的缓存数据就需要“托付”给node3的顺时针后继节点node1。因此受影响的key只有key4。

最终把key4的缓存数据从node3迁移到node1,就形成了新的符合一致性哈希规则的缓存结构。

如上图所示,假如node1的ip是192.168.1.109,那么原node1节点在环形空间的位置就是hash(“192.168.1.109”)。

我们基于node1构建两个虚拟节点,node1-1 和 node1-2,虚拟节点在环形空间的位置可以利用(IP+后缀)计算,例如:

hash(“192.168.1.109#1”),hash(“192.168.1.109#2”)

此时,环形空间中不再有物理节点node1,node2,只有虚拟节点node1-1,node1-2,node2-1,node2-2。由于虚拟节点数量较多,缓存key与虚拟节点的映射关系也变得相对均衡了。

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]48.TPM的目的和使用方法

这是一系列博客文章中最新的一篇,该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 TPM(Trusted Platform Module,可信平台模块) 在检查TPM目的之前&#x…

[dp]leetcode 1025. Divisor Game

输入&#xff1a;一个正整数N 输出&#xff1a;Alice赢&#xff0c;返回true&#xff0c;否则false 规则&#xff1a;黑板上给出一个数字N&#xff0c;ALice先选择。Bob后选择。他们可以选择一个数字 X&#xff0c;0<X<N并且N%X0。一个人选择X以后&#xff0c;黑板上的数…

spring学习(25):通过构造函数依赖注入

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

计算机原理

计算机组成原理 简单易学、开源免费、可移植、可拓展、可嵌入、面向对象&#xff0c;比java、c#等更彻底 谷歌、CIA、nasa、YouTube、Dropbox、Instagram、Facebook、redhat、豆瓣、知乎、春雨医生、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、土豆、新浪、果壳等都在使…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]49.描述在IPsec和TLS后的基本想法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 网络安全协议&#xff08;Internet Protocol Security&#xff0c;IPsec&#xff09;和安全传输层协议&…

spring学习(26):更优雅的依赖注入 在@bean注入参数

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[dp] LeetCode 62. Unique Paths

输入&#xff1a;两个int m和n 输出&#xff1a;一个int,表示不同路径的个数。 规则&#xff1a;有一个m行n列的矩阵&#xff0c;一个机器人从左上角走到右下角&#xff0c;每次向下或者向右走一格。 分析&#xff1a;目的是要找到从(0,0)到(m-1,n-1)有多少种不同 的走法。如果…

springboot 控制台程序读取配置文件(原创)

首先新建一个springboot项目&#xff0c;此处省略。 1.新建一个application.properties person.namekevin person.age6 person.sexmale 2.新建一个类&#xff0c;自动读取对应字段的值 有两种方式&#xff0c; 第一种 package cn.wq;import org.springframework.beans.factory.…

spring学习(27):通过setter依赖注入

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]50.什么是BLS基于对的签名方案?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 转载链接&#xff1a;https://www.cnblogs.com/zhuowangy2k/p/12248721.html

EF(Entity FrameWork)实体框架

一、 1、简称&#xff1a;实体框架 2、ADO.NET Entity FrameWork 是微软以ADO.NET为基础发展出来的对象关系对应&#xff08;O/R Mapping&#xff09;解决方案&#xff1b; 3、ORM框&#xff1a;对象关系映射&#xff08;Object-Relational Mapping&#xff09;&#xff0c;是一…

深度学习04-RNN

文章目录1 为什么需要RNN1.1RNN的应用场景1.2 DNN和CNN不能解决的问题2 RNN的网络结构2.1 RNN基础结构2.2 不同类型的RNN3 RNN的优化算法BPTT4 LSTM5 GRU1 为什么需要RNN 1.1RNN的应用场景 1 模仿论文&#xff08;生成序列&#xff09;。输入是一堆的论文文章&#xff0c;输出…

spring学习(28):处理自动装配的歧义性

pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]51.基于ID的加密安全模型,描述IBE方案

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 在公钥密码学中&#xff0c;如果Alice想要给Bob发送一条消息&#xff0c;她需要Bob的公钥&#xff0c;一般来…

shell 脚本实现退点输出

1、elasticsearch启动脚本 1 #!/bin/bash2 export JAVA_HOME/usr/java/jdk1.8.0_201-amd643 export JAVA_BIN/usr/java/jdk1.8.0_201-amd64/bin4 export PATH$JAVA_BIN:$PATH5 export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar6 export JAVA_HOME JAVA_BIN P…

spring学习(29):xml配置规范

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[dp] LeetCode 91. Decode Ways

输入&#xff1a;一个字符串&#xff0c;只包含0-9的字符。 输出&#xff1a;解码种类 规则&#xff1a;有一种信息映射规则 A->1,B->2…Z->26。 例如输入’1’&#xff0c;只能解码为A。 输入’12’&#xff0c;可以解码为’AB’&#xff0c;也可以是’L’&#xff0…

leetcode——背包问题汇总

本章来汇总一下leetcode中做过的背包问题&#xff0c;包括0-1背包和完全背包。 背包问题的通常形式为&#xff1a;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。求解将哪些物品装入背包里物品价值总和最大。0-1背包和…

[密码学基础][每个信息安全博士生应该知道的52件事]52.先进的应用概念 系统的大致安全需求

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。我们希望学生知道从理论到实践的各个方面。但关键是你需要在密码学中考虑的不仅是对遵守规则的玩家的安全&am…

spring学习(32):使用junit4测试

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…