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

php实现效率有一定的缺失,如果要高效率,还是写扩展比较好
经测试,5个memcache,每个memcache生成100个虚拟节点,set加get1000次,与单个memcache直接set加get慢5倍,所以效率一般,有待优化!
实现过程:
  • memcache的配置 ip+端口+虚拟节点序列号 做hash,使用的是crc32,形成一个闭环。
  • 对要操作的key进行crc32
  • 二分法在虚拟节点环中查找最近的一个虚拟节点
  • 从虚拟节点中提取真实的memcache ip和端口,做单例连接
<?php/*** 一致性哈希memcache分布式,采用的是虚拟节点的方式解决分布均匀性问题,查找节点采用二分法快速查找* the last known user to change this file in the repository  <$LastChangedBy: nash.xiong [        DISCUZ_CODE_0        ]gt;* @author nash.xiong <nash.xiong@gmail.com>* @copyright Copyright &copy; 2003-2012 phpd.cn* @license */class memcacheHashMap {private $_node = array();private $_nodeData = array();private $_keyNode = 0;private $_memcache = null;//每个物理服务器生成虚拟节点个数 [注:节点数越多,cache分布的均匀性越好,同时set get操作时,也更耗资源,10台物理服务器,采用200较为合理]private $_virtualNodeNum = 200; private function __construct() {/* 放入配置文件 */$config = array('127.0.0.1:11211','127.0.0.1:11212','127.0.0.1:11213','127.0.0.1:11214','127.0.0.1:11215');if (!$config) throw new Exception('Cache config NULL');foreach ($config as $key => $value) {for ($i = 0; $i < $this->_virtualNodeNum; $i++) {$this->_node[sprintf("%u", crc32($value . '_' . $i))] = $value . '_' . $i;}}ksort($this->_node);}private function __clone(){}/*** 单例,保证只有一个实例*/static public function getInstance() {static $memcacheObj = null;if (!is_object($memcacheObj)) {$memcacheObj = new self();}return $memcacheObj;}/*** 根据key做一致性hash后连接到一台物理memcache服务器* @param string $key*/private function _connectMemcache($key) {$this->_nodeData = array_keys($this->_node);$this->_keyNode = sprintf("%u", crc32($key));$nodeKey = $this->_findServerNode();//如果超出环,从头再用二分法查找一个最近的,然后环的头尾做判断,取最接近的节点if ($this->_keyNode > end($this->_nodeData)) {$this->_keyNode -= end($this->_nodeData);$nodeKey2 = $this->_findServerNode();if (abs($nodeKey2 - $this->_keyNode) < abs($nodeKey - $this->_keyNode))  $nodeKey = $nodeKey2;}var_dump($this->_node[$nodeKey]);list($config, $num) = explode('_', $this->_node[$nodeKey]);if (!$config) throw new Exception('Cache config Error');if (!isset($this->_memcache[$config])) {$this->_memcache[$config] = new Memcache;list($host, $port) = explode(':', $config);$this->_memcache[$config]->connect($host, $port);}return $this->_memcache[$config];}/*** 采用二分法从虚拟memcache节点中查找最近的节点* @param unknown_type $m* @param unknown_type $b*/private function _findServerNode($m = 0, $b = 0) {$total = count($this->_nodeData);if ($total != 0 && $b == 0) $b = $total - 1;if ($m < $b){$avg = intval(($m+$b) / 2);if ($this->_nodeData[$avg] == $this->_keyNode) return $this->_nodeData[$avg];elseif ($this->_keyNode < $this->_nodeData[$avg] && ($avg-1 >= 0)) return $this->_findServerNode($m, $avg-1);else return $this->_findServerNode($avg+1, $b);}if (abs($this->_nodeData[$b] - $this->_keyNode) < abs($this->_nodeData[$m] - $this->_keyNode))  return $this->_nodeData[$b];else return $this->_nodeData[$m];}public function set($key, $value, $expire = 0) {return $this->_connectMemcache($key)->set($key, json_encode($value), 0, $expire);}public function add($key, $value, $expire = 0) {return $this->_connectMemcache($key)->add($key, json_encode($value), 0, $expire);}public function get($key) {return json_decode($this->_connectMemcache($key)->get($key), true);}public function delete($key) {return $this->_connectMemcache($key)->delete($key);}}$runData['BEGIN_TIME'] = microtime(true);//测试一万次set加getfor($i=0;$i<10000;$i++) {$key = md5(mt_rand());$b = memcacheHashMap::getInstance()->set($key, time(), 10);}var_dump(number_format(microtime(true) - $runData['BEGIN_TIME'],6));$runData['BEGIN_TIME'] = microtime(true); $m= new Memcache;$m->connect('127.0.0.1', 11211); for($i=0;$i<10000;$i++) {$key = md5(mt_rand());$b = $m->set($key, time(), 0, 10);}var_dump(number_format(microtime(true) - $runData['BEGIN_TIME'],6));

//测试结果,采用一致性哈希分布效率比原生单台速度相差5倍左右

转载于:https://www.cnblogs.com/zxz1987/p/6515895.html

memcache分布式 [一致性hash算法] 的php实现相关推荐

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

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

  2. 分布式一致性hash算法

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

  3. MemCache和一致性Hash算法讲解

    文章目录 1 MemCache讲解 1.1 MemCache是什么 1.2 MemCache访问模型 1.3 MemCache写缓存流程 1.4 一致性Hash算法 1.4.1 余数Hash 1.4. ...

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

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

  5. memcached 分布式 一致性hash算法demo

    一致性Hash分布算法分4个步骤: 步骤1:将一个32位整数[0 ~ (2^32-1)]想象成一个环,0 作为开头,(2^32-1) 作为结尾,当然这只是想象. 步骤2:通过Hash函数把KEY处理成 ...

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

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

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

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

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

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

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

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

最新文章

  1. PHPExcel对于Excel中日期和时间类型的处理
  2. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探
  3. Vysor:安卓手机放到电脑上用
  4. OSI网络体系结构各层协议:
  5. Android短信发送流程之长短信发送(原)
  6. 「Docker」Docker教程+学习笔记
  7. 【题解】Luogu P2783 有机化学之神偶尔会做作弊
  8. 向web服务器传文件,c++实现向web服务器上传文件
  9. activemq 实例_在一台计算机上运行多个ActiveMQ实例
  10. Java中getResource()的用法
  11. linux 启动db2 服务器,Linux系统设置DB2等服务开机启动的过程
  12. maven 打包javadoc乱码解决方案
  13. HTTP请求上下文之终结:HttpContext类
  14. 广告流量分析之评价指标的选择(一)
  15. 将python程序打包成可执行文件exe
  16. nginx linux详细安装部署教程,Nginx Linux详细安装及部署实战
  17. Linux下libaio的一个简单例子
  18. YOLO v2算法详解
  19. 【Redis总结-基础入门】
  20. 可解释机器学习- LIME模型讲解|interpretable machine learning-LIME

热门文章

  1. Python zipfile 压缩文件夹
  2. jQuery 动感的横向柱状形投票统计图
  3. SciTE 2.21 汉化版
  4. java集合类——Stack栈类与Queue队列
  5. Python之中文识别
  6. C++系列总结——构造与析构
  7. 34 linux监控平台
  8. 为什么说“概率”带来一场现代革命?
  9. 2月1日学习内容整理:算法
  10. 【Python之旅】第二篇(三):基于列表处理的购物清单程序