一致性哈希memcache php实现

<?php
/**
  * 一致性哈希memcache分布式,采用的是虚拟节点的方式解决分布均匀性问题,查找节点采用二分法快速查找
  * the last known user to change this file in the repository  <$LastChangedBy: nash.xiong $>
  * @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加get
for ( $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倍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值