memcached的分布式算法–一致性hash

2023-05-16

memcached的分布式是什么意思?

下面假设memcached服务器有node1~node3三台,应用程序要保存键名为”tokyo”、”kanagawa”、”chiba”、”saitama”、”gunma”的数据。


首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据”键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存”tokyo”及其值。



同样,”kanagawa”、”chiba”、”saitama”、”gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键”tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。



这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。


根据余数计算分散

Memcached的分布式方法简单来说,就是“根据服务器台数的余数进行分散”。求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。那就是当添加或移除服务器时,缓存重组的代价相当巨大。添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率。


一致性hash(Consistent Hashing)

一致性hash(Consistent Hashing)如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。



从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但一致性hash(Consistent Hashing)中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。



因此,一致性hash(Consistent Hashing)最大限度地抑制了键的重新分布。而且,有的一致性hash(Consistent Hashing)的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。

通过下文中介绍的使用一致性hash(Consistent Hashing)算法的memcached客户端函数库进行测试的结果是,由服务器台数(n)和增加的服务器台数(m)计算增加服务器后的命中率计算公式如下:(1 n/(n+m)) * 100


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

memcached的分布式算法–一致性hash 的相关文章

  • mysql order by rand() 效率优化方法

    从一次查询中随机返回一条数据 xff0c 一般使用mysql的order by rand 方法来实现 例如 从20万用户中随机抽取1个用户 span class hljs header mysql gt select from user o
  • 汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

    汇编语言 xff1a 冒泡排序算法 题目描述 自定义一组有首地址为data的10个字的数组 xff0c 请利用冒泡排序算法来编写程序 xff0c 使该数组中的数按照从小到大的次序有序化 xff08 注 xff1a 10个字可以自己定义 xf
  • 今天终于弄懂结构体数组与结构体变量的关系

    本人也是学计算机专业的 xff0c 但我是一个技术小白 xff0c 今年大一刚刚入学 xff0c 现在在过寒假 xff0c 因为我的C语言成绩并不太好 xff0c 父母总是为我感到担忧 xff0c 因此 xff0c 我每天都在敲代码 xff
  • MongoDB 导出导入备份恢复数据实例

    创建测试数据 创建db testdb collection user 插入10条记录 mongo MongoDB shell span class hljs property version span span class hljs num
  • crontab 使用日期时间命名重定向文件

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 例 xff1a 每天12点执行test php xff0c
  • php 使用redis锁限制并发访问类

    1 并发访问限制问题 对于一些需要限制同一个用户并发访问的场景 xff0c 如果用户并发请求多次 xff0c 而服务器处理没有加锁限制 xff0c 用户则可以多次请求成功 例如换领优惠券 xff0c 如果用户同一时间并发提交换领码 xff0
  • mysql导入大批量数据出现MySQL server has gone away的解决方法

    因工作需要 xff0c 需要导入一个200M左右的sql到user库 执行命令 mysql gt use user Database changed mysql gt span class hljs built in source span
  • mysql 搜寻附近N公里内数据的实例

    根据圆周率和地球半径系数以及搜寻点的经纬度 xff0c 搜寻数据表中与搜寻点之间的距离为N公里内的数据 1 创建测试表 span class hljs operator span class hljs keyword CREATE span
  • crontab 精确到执行分钟内某一秒执行的方法

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 执行指定命令默认是当前执行分钟的第0 1秒开始 例如 xf
  • mongodb 随机获取一条记录的方法

    原理 xff1a 1 先查询表中的记录总数 2 随机获取偏移量为0 总记录数 1 3 查询时skip偏移量 xff0c 再获取1条记录 因本人测试环境php已升级到7 0以上 xff0c mongodb扩展使用支持php7 0以上的扩展 x
  • mysql 连接闪断自动重连的方法

    使用php作为后台运行程序 xff08 例如短信群发 xff09 xff0c 在cli模式下执行php xff0c php需要连接mysql循环执行数据库处理 当mysql连接闪断时 xff0c 之后循环的执行将会失败 我们需要设计一个方法
  • mongodb 判断坐标是否在指定多边形区域内的方法

    MongoDB是一个基于分布式文件存储的数据库 xff0c 并提供创建基于地理空间的索引的能力 xff0c 本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用 1 使用百度拾取坐标工具 xff0c 在地图上定义多边形的坐
  • php 实现HTML实体编号与非ASCII字符串相互转换类

    HTML实体符号被用作实现保留字符 xff08 reserved characters xff09 或者表达键盘无法输入的一些常用字符 在大多数浏览器中默认的字符集为ISO 8859 1 HTML实体符号我们在网页设计中经常用到 例如 xf
  • 阿里云RAM账户日常问题总结

    什么是RAM RAM Resource Access Management 是阿里云为客户提供的用户身份管理与访问控制服务 使用RAM xff0c 您可以创建 管理用户账号 xff08 比如员工 系统或应用程序 xff09 xff0c 并可
  • mysql 出现You can't specify target table for update in FROM clause错误的解决方法

    mysql出现You can t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中 xff0c 先select同一个表的某些值 xff0c 然后再upda
  • php结合mongodb判断坐标是否在指定多边形区域内的实例

    之前写过一篇 mongodb 判断坐标是否在指定多边形区域内的方法 是基于mongodb实现 xff0c 所有操作都是在mongodb执行 这次提供使用php连接mongodb xff0c 判断坐标是否在指定多边形区域内的实例 1 定义多边
  • php ID前缀格式化类

    数据库表通常都会有一个字段类型为int 命名为id的自增主键 优点 xff1a 使用int类型可自增 xff0c 且比字符类型节省存储空间 缺点 xff1a id是数值型 xff0c 当要查询一个id对应的数据时 xff0c 很难根据id判
  • php 将print_r处理后的数据还原为原始数组的方法

    php print r方法可以把变量打印显示 xff0c 使变量易于理解 如果变量是string integer或float xff0c 将打印变量值本身 xff0c 如果变量是array xff0c 将会按照一定格式显示键和元素 obje
  • php PDO判断连接是否可用的方法

    mysql ping 检查到服务器的连接是否正常 如果到服务器的连接可用 xff0c 则返回true xff0c 否则返回false 但PDO不支持mysql ping 方法 xff0c 因此需要自己编写代码模拟mysql ping 方法
  • HTML5获取当前地理位置并在百度地图上展示的实例

    1 HTML5获取当前地理位置 HTML5 Geolocation API xff08 地理位置应用程序接口 xff09 可以获取当前地理位置 xff0c 手机端使用GPS xff0c 电脑则根据网络定位 检查浏览器是否支持HTML5 Ge

随机推荐

  • php 根据自增id创建唯一编号类

    在开发过程中 xff0c 我们数据表一般都使用自增数字作为id主键 xff0c 而id是数字型 xff0c 不容易理解 我们把id按一定格式转为编号后 xff0c 很容易根据编号知道代表的是什么内容 例如订单表id 61 201601111
  • mysql 判断点是否在指定多边形区域内

    本文将介绍使用mysql判断点是否在指定多边形区域内的方法 xff0c 提供完整流程 1 创建测试表 span class hljs operator span class hljs keyword CREATE span span cla
  • php文件包含目录配置open_basedir的使用与性能分析

    1 open basedir介绍 open basedir 将php所能打开的文件限制在指定的目录树中 xff0c 包括文件本身 当程序要使用例如fopen 或file get contents 打开一个文件时 xff0c 这个文件的位置将
  • ajax跨域访问cookie丢失的解决方法

    ajax跨域访问 xff0c 可以使用jsonp方法或设置Access Control Allow Origin实现 xff0c 关于设置Access Control Allow Origin实现跨域访问可以参考之前我写的文章 ajax 设
  • C++-MFC(9)-资源管理器-CShellManager+CMFCShellTreeCtrl

    ShellManager主要就是用来获取系统中某个文件夹的路径而使用 xff0c 在Win32中的使用是比较麻烦的 xff0c 在mfc中 xff0c 它的使用就很简单了 xff0c 主要通过类CShellManager来管理的 要实现它一
  • mysql explain中key_len的计算方法

    mysql的explain命令可以分析sql的性能 xff0c 其中有一项是key len xff08 索引的长度 xff09 的统计 本文将分析mysql explain中key len的计算方法 1 创建测试表及数据 span clas
  • mysql 转换NULL数据方法

    使用mysql查询数据库 xff0c 当执行left join时 xff0c 有些关联的字段内容是NULL xff0c 因此获取记录集后 xff0c 需要对NULL的数据进行转换操作 本文将提供一种方法 xff0c 可以在查询时直接执行转换
  • shell 使用数组作为函数参数的方法

    因工作需要 xff0c 需要使用shell开发一些小工具 xff0c 当使用数组作为函数参数时 xff0c 发现只能传递数组的第一个元素 xff0c 数组后面的元素不能传递到函数内 span class hljs shebang bin b
  • HTML5按比例缩略图片并上传的实例

    上传图片并生成缩略图 xff0c 一般是先把图片上传到服务器 xff0c 然后服务端再对图片进行缩略处理 xff0c 生成缩略图片 上传到服务器后再生成缩略图有两个缺点 xff1a 1 图片尺寸如果过大 xff0c 上传到服务器的时间会较长
  • 利用自定义web-font实现数据防采集

    web font介绍 web font是CSS3中的一种标记 64 font face xff0c 在 64 font face声明里 xff0c 你可以声明一种字体 xff0c 指定这种字体字体库文件从网络某个地址下载 具体写法如下 xf
  • Linux alias命令的使用

    Linux alias命令用来设置指令的别名 xff0c 对一些较长的命令进行简化 使用alias时 xff0c 必须使用单引号将原来的命令包含 xff0c 防止特殊字符导致错误 1 设置别名 span class hljs keyword
  • MongoDB 批量添加记录中不存在的字段

    MongoDB是基于分布式文件存储的数据库 xff0c 与关系型数据库不同 xff0c 记录中的字段数量可以各不相同 本文将介绍如何对MongoDB记录中不存在的字段进行批量添加并赋值 MongoDB update方法 update 方法用
  • Git 常用命令列表

    Git是一款免费 开源的分布式版本控制系统 xff0c 用于敏捷高效地处理任何或小或大的项目 xff0c 本文将介绍git常用的命令 1 回滚到上一版本 xff08 撤销本次所有操作 xff09 span class hljs commen
  • 编辑距离

    编辑距离 xff0c 又称Levenshtein距离 xff08 也叫做Edit Distance xff09 xff0c 是指两个字串之间 xff0c 由一个转成另一个所需的最少编辑操作次数 许可的编辑操作包括将一个字符替换成另一个字符
  • ubuntu下安装Apache+PHP+Mysql

    步骤一 xff0c 安装apache2 sudo apt get install apache2 安装完成 运行如下命令重启下 xff1a sudo etc init d apache2 restart 在浏览器里输入http localh
  • Redhat-ansible-合集

    1 安装 2 部署ANSIBLE 2 1INVENTORY 2 2ANSIBLE配置文件 2 3AD HOC命令 3 PLAYBOOK 4 变量 5 ansible vault加密变量 6 ansible facts 7 loop 8 条件
  • 如何在ubuntu上安装node.js

    Node js是一套用来编写高性能网络服务器的JavaScript工具包 xff0c 一系列的变化由此开始 比较独特的是 xff0c Node js会假设你是在POSIX环境下运行它 Linux 或 Mac OS X 如果你是在Window
  • 在ubuntu下安装memcache

    使用Memcache的网站一般流量都是比较大的 xff0c 为了缓解数据库的压力 xff0c 让Memcache作为一个缓存区域 xff0c 把部分信息保存在内存中 xff0c 在前端能 够迅速的进行存取 下面来介绍一下如何安装和使用mem
  • 尝试用Gearman实现分布式处理(PHP)

    本文需要你已对Gearman有个大致了解 顺便再推荐两篇参考文章 http hi baidu com thinkinginlamp blog item ff49972b9e7378f3e6cd40aa html xff08 学学Gearma
  • memcached的分布式算法–一致性hash

    memcached的分布式是什么意思 xff1f 下面假设memcached服务器有node1 xff5e node3三台 xff0c 应用程序要保存键名为 tokyo kanagawa chiba saitama gunma 的数据 首先