/**
* memcached 一致性hash,分布式算法
* Class MemcacheCluster
*/
class MemcacheCluster
{
protected $nodes = array(); //服务器节点
protected $position = array(); //虚拟节点
protected $virtualNum = 32; //每个节点有32个虚拟节点;具体数量也可以 16 ,8等 public function hash($str)
{
//将字符串转成32位符号整数
return sprintf("%u", crc32($str));
} //查找key 落到哪个节点上
public function findNode($key)
{
$point = $this->hash($key); //先取圆环上最小的一个节点
//$key 哈希后比最大的节点都大就放到第一个节点
$node = current($this->position);
//下面这个查找可以后期优化为二分查找法。
foreach ($this->position as $k => $v) {
if ($point <= $k) {
$node = $v;
break;
}
}
//复位数组指针
reset($this->position);
return $node;
} public function addNode($node)
{
if (isset($this->nodes[$node])) {
return;
}
for ($i = 0; $i < $this->virtualNum; $i++) {
$pos = $this->hash($node . '-' . $i);
$this->position[$pos] = $node;
//方便删除对应的虚拟节点
$this->nodes[$node][] = $pos;
}
$this->sortPos();
} public function delNode($node)
{
if (!isset($this->nodes[$node])) {
return;
}
//循环所有的虚节点,谁的值==指定的真实节点 ,就把他删掉
foreach ($this->nodes[$node] as $k) {
unset($this->position[$k]);
}
unset($this->nodes[$node]);
} protected function sortPos()
{
//将虚拟节点排序
//把每一项按常规顺序排列(Standard ASCII,不改变类型)
ksort($this->position, SORT_REGULAR);
}
}

Memcached 之PHP实现服务器集群一致性hash算法的更多相关文章

  1. Linux下使用Magent+Memcached缓存服务器集群部署

    1.编译安装libevent  cd /root/soft_hhf/  wget http://cloud.github.com/downloads/libevent/libevent/libeven ...

  2. nginx+tomcat+memcached搭建服务器集群及负载均衡

    在实际项目中,由于用户的访问量很大的原因,往往需要同时开启多个服务器才能满足实际需求.但是同时开启多个服务又该怎么管理他们呢?怎样实现session共享呢?下面就来讲一讲如何使用tomcat+ngin ...

  3. 集群扩容的常规解决:一致性hash算法

    写这篇博客是因为之前面试的一个问题:如果memcached集群需要增加机器或者减少机器,那么其他机器上的数据怎么办? 最后了解到使用一致性hash算法可以解决,下面一起来学习下吧. 声明与致谢: 本文 ...

  4. redis集群与分片(1)-redis服务器集群、客户端分片

    下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型 ...

  5. nginx 的安装、优化、服务器集群

    一.安装 下载地址:http://nginx.org  找到 stable 稳定版 安装准备:nginx 依赖于pcre(正则)库,如果没有安装pcre先安装 yum install pcre pcr ...

  6. Linux服务器集群系统(二)--转

    引用地址:http://www.linuxvirtualserver.org/zh/lvs2.html LVS集群的体系结构 章文嵩 (wensong@linux-vs.org) 2002 年 4 月 ...

  7. zookeeper作为soa服务器集群的协调调度服务器

    zookeeper作为soa服务器集群的协调调度服务器,当然自身也支持集群. ZooKeeper搭建系列集 ZooKeeper系列之一:ZooKeeper简介 ZooKeeper系列之二:ZooKee ...

  8. 浅析Linux服务器集群系统技术

    浅析Linux服务器集群系统技术 目录 前言 常用的服务器集群 集群系统的优势 LVS集群的通用体系结构 为什么使用层次的体系结构 为什么是共享存储 可伸缩Web服务 前言 总结两篇技术文章,努力学习 ...

  9. 转载-lvs官方文档-Linux服务器集群系统(二)

    Linux服务器集群系统(二) LVS集群的体系结构 章文嵩 (wensong@linux-vs.org) 2002 年 4 月 本文主要介绍了LVS集群的体系结构.先给出LVS集群的通用体系结构,并 ...

随机推荐

  1. Swift: 转换NSString to String

    如下代码获取一个String?的结果 let s = NSString(data: data, encoding: encoding) return s as? String

  2. Ubuntu 10.04.3 挂载NTFS移动硬盘

    1: fdisk -l #查看所有连接到电脑上的储存设备 2:  mkdir -p /mnt/需要掛的分區 #在mnt裏建立準備掛載分區的目錄 3:  mount -t ntfs /dev/需要掛的分 ...

  3. 使用DBMS_REDEFINITION在线切换普通表到分区表

    随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...

  4. [Vue-rx] Disable Buttons While Data is Loading with RxJS and Vue.js

    Streams give you the power to handle a "pending" state where you've made a request for dat ...

  5. 阿里云部署Docker(2)

    之前有一篇文章讲过在阿里云中安装Docker,相对来说那个是安装.可是安装完之后我们通常会碰到问题. 今天我给大家记录一下我的新的解决过程. 环境还是ubuntu12.04.如果我们已经把内核升级到了 ...

  6. linux系统下用到的小知识点积累

    preface:在ubuntu下做事情,在终端下执行一些命令.或者在vim里面做一些操作.自然而然须要用到一些小知识点,没有怎么系统地看<鸟哥的菜>,基本上是遇到了什么问题想要实现什么功能 ...

  7. 从es中提取全量数据的shell脚本

    [root@hadoop3 xiaole_chk_url]# sh looh.es.res.sh 100 200 1 % Total % Received % Xferd Average Speed ...

  8. 数据库操作语句大全(sql)

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  9. extern_c

    (1)    使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直截了当的,想引用哪个函数就用extern声明哪个函数.这大概是 ...

  10. 云栖社区> > 正文 永久免费SSL安全证书Letsencrypt安装使用方法

    ./letsencrypt-auto certonly --standalone --email admin@thing.com -d thing.com -d www.thing.com