国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

Memcached分布式部署方案設計(含PHP代碼)

2024-05-04 21:49:46
字體:
來源:轉載
供稿:網友

一臺Memcache通常不能滿足我們的需求,這就需要分布式部署。Memcached分布式部署方案通常會采用兩種方式,一種是普通Hash分布,一種是一致性Hash分布,本篇將以PHP作為客戶端,來分析兩種方案.

一、普通Hash分布:

  1. <?php 
  2. function test($key='name'){ 
  3.     $md5 = substr(md5($key), 0, 8); 
  4.     $seed = 31; 
  5.     $hash = 0; 
  6.     for($i=0; $i<8; $i++){ 
  7.         $hash = $hash * $seed + ord($md5[$i]); 
  8.     } 
  9.     return $hash & 0x7FFFFFFF; 
  10. $memcacheList = array
  11.         array('host'=>'192.168.1.2''port'=>6379), 
  12.         array('host'=>'192.168.1.3''port'=>6379), 
  13.         array('host'=>'192.168.1.4''port'=>6379), 
  14.         array('host'=>'192.168.1.5''port'=>6379), 
  15. ); 
  16. $key = 'username'
  17. $value = 'lane'
  18. //根據KEY獲取hash 
  19. $hash = $this->test($key); 
  20. $count = count($memcacheList); 
  21. $memcache = $memcacheList[$hash % $count]; 
  22. $mc = new Memcached($memcache); 
  23. $mc->set($key$value); 
  24. ?> 

代碼很簡單,一個Hash函數,根據所需要的key,將他md5后取前8位,然后經過Hash算法返回一個整數,將這個整數對服務器總數求模,得到的就是服務器列表的編號,這種方式的缺點是服務器數量改變后,同一個key不同hash,將取不到值了.

二、一致性Hash分布

一致性Hash盡管也會造成數據的丟失,但是損失是最小的,將2的32次方-1想象成一個圓環,服務器列表在上面排列,根據key通過hash算法求得在圓環上的位置,那么所需要的服務器的位置在key的位置前面最近的一個(順時針).

  1. <?php 
  2. class FlexiHash{ 
  3.     //服務器列表 
  4.     private $serverList = array(); 
  5.     //是否排序 
  6.     private $isSort = false; 
  7.     /** 
  8.      * Description: Hash函數,將傳入的key以整數形式返回 
  9.      * @param string $key 
  10.      * @return int 
  11.      */ 
  12.     private function myHash($key){ 
  13.         $md5 = substr(md5($key), 0, 8); 
  14.         $seed = 31; 
  15.         $hash = 0; 
  16.         for($i=0; $i<8; $i++){ 
  17.             $hash = $hash * $seed + ord($md5[$i]); 
  18.         } 
  19.         return $hash & 0x7FFFFFFF; 
  20.     } 
  21.     /** 
  22.      * Description: 添加新服務器 
  23.      * @param $server 
  24.      */ 
  25.     public function addServer($server){ 
  26.         $hash = $this->myHash($server); 
  27.         if(!isset($this->serverList[$hash])){ 
  28.             $this->serverList[$hash] = $server
  29.         } 
  30.         $this->isSort = false; 
  31.         return true; 
  32.     } 
  33.     /** 
  34.      * Description: 刪除指定服務器 
  35.      * @param $server 
  36.      * @return bool 
  37.      */ 
  38.     public function removeServer($server){ 
  39.         $hash = $this->myHash($server); 
  40.         if(isset($this->serverList[$hash])){ 
  41.             unset($this->serverList[$hash]); 
  42.         } 
  43.         $this->isSort = false; 
  44.         return true; 
  45.     } 
  46.     /** 
  47.      * Description: 根據要操作的KEY返回一個操作的服務器信息 
  48.      * @param $key 
  49.      * @return mixed 
  50.      */ 
  51.     public function lookup($key){ 
  52.         //將指定的KEYhash出一個整數 
  53.         $hash = $this->myHash($key); 
  54.         if($this->isSort !== true){ 
  55.             krsort($this->serverList); 
  56.             $this->isSort = false; 
  57.         } 
  58.         foreach($this->serverList as $key=>$server){ 
  59.             if($key <= $hash){ 
  60.                 return $server
  61.             } 
  62.         } 
  63.         return array_pop($this->serverList); 
  64.     }  //開源軟件:Vevb.com 
  65. //使用方法 
  66. $mc = new FlexiHash(); 
  67. $mc->addServer('192.168.1.2'); 
  68. $mc->addServer('192.168.1.3'); 
  69. $mc->addServer('192.168.1.4'); 
  70. $mc->addServer('192.168.1.5'); 
  71. echo 'KEY=key1時,操作的服務器為:'.$mc->lookup('key1').'<br>'
  72. echo 'KEY=key1時,操作的服務器為:'.$mc->lookup('key2').'<br>'
  73. echo 'KEY=key1時,操作的服務器為:'.$mc->lookup('key3').'<br>'
  74. echo 'KEY=key1時,操作的服務器為:'.$mc->lookup('key4').'<br>'
  75. echo 'KEY=key1時,操作的服務器為:'.$mc->lookup('key5').'<br>'
  76. ?>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿拉尔市| 沁源县| 北辰区| 南康市| 全椒县| 彰化县| 武冈市| 荥阳市| 互助| 沂南县| 山阳县| 天台县| 遂宁市| 柳河县| 威宁| 仙桃市| 师宗县| 红安县| 射阳县| 藁城市| 弋阳县| 彩票| 津市市| 柳江县| 基隆市| 宜春市| 揭东县| 特克斯县| 金华市| 青冈县| 吉安县| 澳门| 古田县| 修水县| 成武县| 新建县| 柳江县| 兰州市| 外汇| 甘洛县| 新竹县|