亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

memcache一致性hash的php實現方法

2024-05-04 23:31:54
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了memcache一致性hash的php實現方法,實例分析了memcache中hash一致性的實現原理與相關技巧,需要的朋友可以參考下
 

本文實例講述了memcache一致性hash的php實現方法。分享給大家供大家參考。具體如下:

最近在看一些分布式方面的文章,所以就用php實現一致性hash來練練手,以前一般用的是最原始的hash取模做 分布式,當生產過程中添加或刪除一臺memcache都會造成數據的全部失效,一致性hash就是為了解決這個問題,把失效數據降到最低,相關資料可以 google一下!

php實現效率有一定的缺失,如果要高效率,還是寫擴展比較好

經測試,5個memcache,每個memcache生成100個虛擬節點,set加get1000次,與單個memcache直接set加get慢5倍,所以效率一般,有待優化!

在閱讀本文之前,最好知道二分查找法。

實現過程:

memcache的配置 ip+端口+虛擬節點序列號 做hash,使用的是crc32,形成一個閉環。
對要操作的key進行crc32
二分法在虛擬節點環中查找最近的一個虛擬節點
從虛擬節點中提取真實的memcache ip和端口,做單例連接

復制代碼代碼如下:

<?php
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(//五個memcache服務器
                                                '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;//循環為每個memcache服務器創建200個虛擬節點
                        }
                }
                ksort($this->_node);//創建出來的1000個虛擬節點按照鍵名從小到大排序
        }
        //實例化該類
        static public function getInstance() {
                static $memcacheObj = null;
                if (!is_object($memcacheObj)) {
                        $memcacheObj = new self();
                }
                return $memcacheObj;
        }
        //根據傳來的鍵查找到對應虛擬節點的位置
        private function _connectMemcache($key) {
                $this->_nodeData = array_keys($this->_node);//所有的虛擬節點的鍵的數組
                $this->_keyNode = sprintf("%u", crc32($key));//算出鍵的hash值
                $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];
        }
        //二分法根據給出的值找出最近的虛擬節點位置
        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));
?>

 

希望本文所述對大家的php程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
超碰97人人做人人爱少妇| 欧美视频二区36p| 亚洲r级在线观看| 亚洲精品欧美日韩| 国产在线精品成人一区二区三区| 国产97在线亚洲| 欧美激情视频网| 久久久久久久久久久久av| 欧美亚洲国产另类| 亚洲图片在区色| 国产噜噜噜噜噜久久久久久久久| 91精品啪在线观看麻豆免费| 久久视频在线免费观看| 亚洲欧美日韩国产成人| 久久久久久av| 国产精品美女无圣光视频| 久久69精品久久久久久国产越南| 激情亚洲一区二区三区四区| 日韩视频免费在线| 欧美成人精品激情在线观看| 午夜精品一区二区三区视频免费看| 久久久久久av| 久久久999国产精品| 国产精品中文在线| 亚洲国产精久久久久久久| 国产精品久久久久久久久久久不卡| 国产精品偷伦视频免费观看国产| 欧美精品午夜视频| 亚洲偷欧美偷国内偷| 国产精品偷伦免费视频观看的| 欧美激情奇米色| 中文字幕少妇一区二区三区| 夜夜狂射影院欧美极品| 在线午夜精品自拍| 国产丝袜一区二区三区| 伊人青青综合网站| 欧美日韩成人精品| 久久理论片午夜琪琪电影网| 亚洲人成电影在线观看天堂色| 成人看片人aa| 国产精品第一第二| 久久人人爽亚洲精品天堂| 亚洲国产成人精品女人久久久| 国产精品久久久av久久久| 国产主播欧美精品| 国产成人鲁鲁免费视频a| 久久免费精品日本久久中文字幕| 国产精品男女猛烈高潮激情| 欧美乱大交做爰xxxⅹ性3| 亚洲男人天堂视频| 国产精品wwww| 日韩a**站在线观看| 久久这里只有精品视频首页| 国产精品入口免费视频一| 欧美高跟鞋交xxxxxhd| 精品一区二区三区四区| 欧美激情免费观看| 热99精品只有里视频精品| 日韩影视在线观看| 操人视频在线观看欧美| 成人av.网址在线网站| 韩日欧美一区二区| 欧美中文字幕在线观看| 精品视频久久久久久久| 国产精品亚洲片夜色在线| 美日韩精品视频免费看| 久久精品99久久久香蕉| 国产91ⅴ在线精品免费观看| 51久久精品夜色国产麻豆| 97涩涩爰在线观看亚洲| 国产欧美日韩亚洲精品| 国产一区二区三区日韩欧美| 黑人与娇小精品av专区| 久久精品成人动漫| 国产狼人综合免费视频| 在线观看中文字幕亚洲| 2020欧美日韩在线视频| 精品久久久国产| 最新69国产成人精品视频免费| 日韩成人激情视频| 精品国产鲁一鲁一区二区张丽| 96国产粉嫩美女| 久久伊人精品视频| 日韩中文综合网| 欧美激情18p| 日韩av在线最新| 久久影视免费观看| 亚洲一品av免费观看| 亚洲春色另类小说| 亚洲国产高清高潮精品美女| 欧美一级淫片videoshd| 日韩中文字幕免费视频| 日韩网站在线观看| 91精品在线观| 最新日韩中文字幕| 久久亚洲私人国产精品va| 最近2019中文免费高清视频观看www99| 欧美成人中文字幕| 国产视频自拍一区| 国产精品永久免费| 少妇高潮久久久久久潘金莲| 欧美视频精品一区| 国产精品久久99久久| 久久九九国产精品怡红院| 欧美老女人在线视频| 91久久精品久久国产性色也91| 久久久久北条麻妃免费看| 亚洲高清色综合| 亚洲天天在线日亚洲洲精| 国产成人综合一区二区三区| 亚洲精品国产福利| 精品视频久久久久久| 亚洲成人999| 亚洲美女性生活视频| 欧美激情视频播放| 日韩精品极品在线观看播放免费视频| 国产精品网红直播| 久久久精品中文字幕| 亚洲free性xxxx护士白浆| 久久激情视频免费观看| 日本三级韩国三级久久| 日韩精品在线免费播放| 欧美电影电视剧在线观看| 亚洲三级黄色在线观看| 国产日韩在线视频| 国产精品第一第二| 国产精品久久在线观看| 亚洲人成在线一二| 欧美性20hd另类| 久久久av电影| 亚洲国产91色在线| 国产精品亚洲精品| 黑人巨大精品欧美一区二区一视频| 一区二区三区视频观看| 久久成人18免费网站| 亚洲国产精品小视频| 国产午夜精品一区理论片飘花| 久久综合伊人77777蜜臀| 国产精品91久久| 国产日韩在线播放| 国语自产精品视频在线看一大j8| 国产精品扒开腿做爽爽爽视频| 2024亚洲男人天堂| 国外日韩电影在线观看| 国产精品入口免费视| 国产亚洲成av人片在线观看桃| 亚洲小视频在线| 国产成人av在线| 亚洲人午夜色婷婷| 欧美福利在线观看| 欧美激情一区二区三区在线视频观看| 精品国内产的精品视频在线观看| 精品国产一区二区三区久久| 亚洲欧洲中文天堂| 国产视频亚洲精品| 色99之美女主播在线视频| 日本精品免费一区二区三区| 黑人巨大精品欧美一区免费视频| 欧洲成人在线观看| 91精品国产沙发| 91亚洲精品久久久久久久久久久久| 国产午夜精品久久久| 亚洲性av在线| 精品国产欧美一区二区三区成人|