一致性Hash分布算法分4个步骤:
步骤1:将一个32位整数[0 ~ (2^32-1)]想象成一个环,0 作为开头,(2^32-1) 作为结尾,当然这只是想象。
步骤2:通过Hash函数把KEY处理成整数。这样就可以在环上找到一个位置与之对应。
步骤3:把Memcached服务器群映射到环上,使用Hash函数处理服务器对应的IP地址即可。
步骤4:把数据映射到Memcached服务器上。查找一个KEY对应的Memcached服务器位置的方法如下:从当前KEY的位置,沿着圆环顺时针方向出发,查找位置离得最近的一台Memcached服务器,并将KEY对应的数据保存在此服务器上。

代码实例:

<?php
/*** 一致性Hash分布* 天涯PHP博客* http://blog.phpha.com*/
class FlexiHash{//服务器列表private $serverList = array();//记录是否已经排序private $isSorted = FALSE;//添加一台服务器public function addServer($server){$hash = $this->mHash($server);if(!isset($this->serverList[$hash])){$this->serverList[$hash] = $server;}//需要重新排序$this->isSorted = FALSE;return TRUE;}//移除一台服务器public function removeServer($server){$hash = $this->mHash($server);if(isset($this->serverList[$hash])){unset($this->serverList[$hash]);}//需要重新排序$this->isSorted = FALSE;return TRUE;}//在当前服务器列表查找合适的服务器public function lookup($key){$hash = $this->mHash($key);//先进行倒序排序操作if(!$this->isSorted){krsort($this->serverList, SORT_NUMERIC);$this->isSorted = TRUE;}//圆环上顺时针方向查找当前KEY紧邻的一台服务器foreach($this->serverList as $pos => $server){if($hash >= $pos)  return $server;}//没有找到则返回顺时针方向最后一台服务器return $this->serverList[count($this->serverList) - 1];}//Hash函数private function mHash($key){$md5 = substr(md5($key), 0, 8);$seed = 31;$hash = 0;for($i = 0; $i < 8; $i++){$hash = $hash * $seed + ord($md5{$i});$i++;}return $hash & 0x7FFFFFFF;}
}
?>

  

测试:

<?php
/*** 一致性Hash分布测试代码* 天涯PHP博客* http://blog.phpha.com*/
$hserver = new FlexiHash();
//初始5台服务器
$hserver->addServer("192.168.1.1");
$hserver->addServer("192.168.1.2");
$hserver->addServer("192.168.1.3");
$hserver->addServer("192.168.1.4");
$hserver->addServer("192.168.1.5");
echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>";
echo "save key2 in server: ", $hserver->lookup('key2'), "<br/>";
echo '===============================================<br/>';
//移除1台服务器
$hserver->removeServer("192.168.1.4");
echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>";
echo "save key2 in server: ", $hserver->lookup('key2'), "<br/>";
echo '===============================================<br/>';
//添加1台服务器
$hserver->addServer('192.168.1.6');
echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>";
echo "save key2 in server: ", $hserver->lookup('key2');
?>

//测试结果如下:
save key1 in server: 192.168.1.4
save key2 in server: 192.168.1.2
==================================
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.2
==================================
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.2

  

转载于:https://www.cnblogs.com/icyy/p/5198998.html

memcached 分布式 一致性hash算法demo相关推荐

  1. 分布式一致性hash算法

    写在前面   在学习Redis的集群内容时,看到这么一句话:Redis并没有使用一致性hash算法,而是引入哈希槽的概念.而分布式缓存Memcached则是使用分布式一致性hash算法来实现分布式存储 ...

  2. 【java】分布式一致性hash算法

    1.概述 本文是视频 视频 的笔记 2. 一致性hash算法哪里用? 一般情况下如果我们的数据很多,一台机器装不下,我们一般会采用分布式缓存,但是因为是分布式,我们要解决3个问题 数据怎么存储到分布式 ...

  3. memcache分布式 [一致性hash算法] 的php实现

    以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是为了解决这个问题,把失效数据降到最低,相关资料可以google一下! p ...

  4. php 一致性hash,【转载】memcache分布式 [一致性hash算法] 的php实现

    最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是 ...

  5. 「分布式专题」分布式系统中一致性hash算法

    近年来B2C.O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来.分布式系统相对于单系统,解决了流量大.系统高可用和高容错等问题.功能强大也意味着实现起来需要更多技术的支持.例如系统访问层 ...

  6. hash,bloomfilter,分布式一致性hash

    场景 使用word 文档时,判断某个单词是否拼写正确 垃圾邮件过滤算法 Redis缓存穿透 bitcoin core中交易校验 需求 从海量数据中查询某个字符串是否存在? 平衡二叉搜索树 增删改查时间 ...

  7. 分布式缓存原理——一致性hash算法(hash环)、Hash槽

    一.一致性哈希算法:一种特殊的哈希算法,目前主要应用于分布式缓存当中,可以有效地解决分布式存储结构下动态增加和删除节点所带来的问题. 一致性Hash算法是对2^32取模,2^32个点组成的圆环称为Ha ...

  8. 一致性hash算法_分布式寻址算法

    一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...

  9. 一致性 Hash 算法学习(分布式或均衡算法)

    简介: 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的 ...

最新文章

  1. 游戏开发论坛_OPPO开发者大会前瞻:见证OPPO智能服务新生态
  2. Ubuntu11.10 GNOME Shell指南
  3. 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
  4. 皮一皮:这有够不明显的...
  5. 图解 windbg设置符号文件路径和使用入门
  6. 【在线画流程图】网站
  7. 关于landau函数
  8. ASP.NET系列:自定义配置节点的复用
  9. Django集合Ueditor
  10. 远控免杀专题(18)-ASWCrypter免杀
  11. vuex 源码分析_前端入门之(vuex-router-sync解析)
  12. if单分支,二分支,多分支
  13. ArcGIS_重分类
  14. ccd后视摄像头_20192020年车载摄像头产业报告
  15. python selenium 下载附件通过oss上传
  16. 综合布线系统工程施工管理
  17. 正交补与矩阵的正交补
  18. 传染病研究-非靶向下一代宏基因组测序(mNGS)分析
  19. 【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)
  20. 焦虑症是精神病吗?缓解焦虑症的方法有哪些

热门文章

  1. 根文件系统挂载过程分析
  2. java知识积累——单元测试和JUnit(二)
  3. Excel 2010单元格中设置表头
  4. JSP学习02-config内置对象
  5. [转载]AIX 上 Lotus Domino 的内存使用
  6. Solaris的syslog机制
  7. 忘记root密码如何处理
  8. 被上海爱立信录取,GL
  9. [JAVA]deep copy链表
  10. K8S-网络模型、POD/RC/SVC YAML 语法官方文档