memcached 分布式集群,该决定必须书面开发商自己。和redis 由分布式server决定。上 memcached 有两个选项用于分布式。第一个是:模运算

另一种是:一致性hash 分布式算法。以下我就这两种算法简介一下。

一、取模算法:

取模算法是不靠谱的算法,当有n 台server,突然一台server突然down 掉了。memcached 的命中率仅仅有1/n-1。结果是怎么来的,自己想想吧。比方有8台memchached

server,0,1,2,3。4,5。6,7,8  这8个数字存入到memcached server,突然有一台memcached serverdown 掉了。

我们用取模法,从memcached server取值。

发现仅仅有0。1,2。3,4,5,6。56 这些数被7,8取模的值是一样的。也就是说这么写能被命中。

也就得出了结论 n/n(n-1) 个数可以被命中。相同也得出结论server集群越大,

命中率也就越低。

这中算法直接pass 掉。

并且命中率会无限趋进于0。

二、一致性hash 分布式算法:

介绍这样的算法。首先我引进一个概念是虚拟节点。虚拟节点也就是说在没台memcached server虚拟非常多节点。并算出每一个节点的hash 值。

存key 时,同一时候计算出key 的hash

值,当key的hash 值,接近或等于某个节点的hash 值,就放到某个 memcached server。当某个memcached serverdown 掉后。其它server共同承担这台server的压力。

以下是我的一段代码:

<?php
/*
memcached 一致性hash分布式算法
*/
interface hash{
public function _hash($str); // hash 算法
} interface distribution{
public function _lookup($key);
} class contents implements hash,distribution{
public $address_array=array();
public function _hash($str){
return sprintf("%u",crc32($str));
}
public function _lookup($key){ //通过key 找到server
$look_key=$this->_hash($key);
$current_key=current($this->address_array);
foreach($this->address_array as $key=>$value){
if($look_key<=$key){
$current_key=$key;
break;
}
}
return $value;
}
public function _address($node){ // 虚拟节点
for($i=0;$i<64;$i++){
$key=$this->_hash($node.'_'.$i);
$this->address_array[$key]=$node;
}
$this->_sortkey();
}
public function _sortkey(){ // 对hash 后的值排序
ksort($this->address_array,SORT_REGULAR);
} public function delnode($node){ // down 掉了某台server
$new_address=array_diff_key($this->address_array,array_flip(array_keys($this->address_array,$node)));
$this->address_array=$new_address;
return $new_address;
}
}

以下另一段模拟降低一台memcached server的代码:

<?php
require_once 'config.php'; //载入配置文件
require_once 'distribute.php'; //载入一致hash
$distribute=new contents(); //循环加入server
foreach($mem_array as $key=>$value){
$distribute->_address($key);
} //降低一台server
$distribute->delnode('B'); for($i=0;$i<10000;$i++){
$key='key'.sprintf("%04d",$i);
$memca_key=$distribute->_lookup($key);
$memca_party=$mem_array[$memca_key];
$memcache = memcache_connect($memca_party['ip'],$memca_party['port']);
if(!$memcache->get($key)){
$memcache->add($key,'value'.$i,0,0);
}
$memcache->close(); }

以下是memcached server的配置文件

 /*
memcached 的配置文件
*/
$mem_array=array(
'A'=>array('ip'=>'127.0.0.1','port'=>'11211'),
'B'=>array('ip'=>'127.0.0.1','port'=>'11212'),
'C'=>array('ip'=>'127.0.0.1','port'=>'11213'),
'D'=>array('ip'=>'127.0.0.1','port'=>'11214')
);

以下是计算memcached 的命中率:

<?php 

   require_once 'config.php';  //载入配置文件
$int_get=0;
$int_hits=0;
$rand=1;
foreach($mem_array as $value){
$memcache = memcache_connect($value['ip'],$value['port']);
$statistics =$memcache->getStats();
$int_get += $statistics['cmd_get'];
$int_hits += $statistics['get_hits'];
}
if($int_get==0){
echo $rand;
return true;
}
$rand=$int_hits/$int_get;
echo $rand;

以下是highcharts 插件统计的 memcached 命中率

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Highcharts Example</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<style type="text/css">
${demo.css}
</style>
<script type="text/javascript">
$(function () {
$(document).ready(function () {
Highcharts.setOptions({
global: {
useUTC: false
}
}); $('#container').highcharts({
chart: {
type: 'spline',
animation: Highcharts.svg, // don't animate in old IE
marginRight: 10,
events: {
load: function () { // set up the updating of the chart each second
var series = this.series[0];
setInterval(function () {
var x = (new Date()).getTime(), // current time
y = parseFloat($.ajax({url:'hit.php',async:false}).responseText);
series.addPoint([x, y], true, true);
}, 1000);
}
}
},
title: {
text: 'memcached 命中率'
},
xAxis: {
type: 'datetime',
tickPixelInterval: 150
},
yAxis: {
title: {
text: 'Value'
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
formatter: function () {
return '<b>' + this.series.name + '</b><br/>' +
Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
Highcharts.numberFormat(this.y, 2);
}
},
legend: {
enabled: false
},
exporting: {
enabled: false
},
series: [{
name: 'Random data',
data: (function () {
// generate an array of random data
var data = [],
time = (new Date()).getTime(),
i; for (i = -19; i <= 0; i += 1) {
data.push({
x: time + i * 1000,
y: Math.random()
});
}
return data;
}())
}]
});
});
});
</script>
</head>
<body>
<script src="js/highcharts.js"></script>
<script src="js/modules/exporting.js"></script> <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div> </body>
</html>

memcached 分布式聚类算法的更多相关文章

  1. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

  2. 09 Memcached 分布式之取模算法的缺陷

    一: Memcached 分布式之取模算法的缺陷(1)假设你有8台服务器,运行中突然down一台,则求余数的底数就7. 后果: key_0%8==0 ,key_0%7==0 =>hist(命中) ...

  3. Memcached 分布式缓存实现原理

    摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...

  4. 缓存应用--Memcached分布式缓存简介

    一.   什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态. ...

  5. memcached分布式实现原理

    摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...

  6. memcached分布式缓存

    1.memcached分布式简介 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能.Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算 ...

  7. 【转】memcached分布式部署

    FROM : http://www.tuicool.com/articles/777nE3j memcache和memcached两者使用起来几乎一模一样. $mem = new Memcache; ...

  8. 让memcached分布式

    memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较 ...

  9. memcached分布式部署

    memcache和memcached两者使用起来几乎一模一样. $mem = new Memcache; $mem->addServer($memcachehost, '11211'); $me ...

随机推荐

  1. ContentProvider简要

    1.什么是ContentProvider  数据库在Android其中是私有的,当然这些数据包含文件数据和数据库数据以及一些其它类型的数据.  不能将数据库设为WORLD_READABLE,每一个数据 ...

  2. javascript (十四) dom

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...

  3. 全局忽略编译警告(设置QMAKE_CXXFLAGS )

    msvc编译器从2010 sp1开始就已经支持UTF-8的源码文件了,然后到vs2012又不支持了,官方表示是BUG.到目前最新的vs2013就解决了这个问题... 但是在编译时仍然会出现4819的警 ...

  4. 用yum查询想安装的软件

    1.使用YUM查找软件包  命令:yum search~  2.列出所有可安装的软件包  命令:yum list  3.列出所有可更新的软件包  命令:yum list updates  4.列出所有 ...

  5. MyBATIS使用CRUD

    MyEclipse不提供自己主动生成,这里提供mybatis文件包和开发文档 http://download.csdn.net/detail/u010026901/7489319 自己建立配置文件, ...

  6. js下读取input中的value值

    很多人(包括我),总想像以前操作js一样,读取到input中的值:document.getElementById('').value; 结果事实证明这样读到得是null. eval(document. ...

  7. visio ppt axure AI svg powerdesign xmind

    visio  ppt  axure  AI svg powerdesign xmind

  8. HDU 4921 Map

    题意: 给n个节点  他们形成了最多10条链  每条最多1000的长度  每一个节点有个val  你能够选择任何位置截断链  断点前的全部节点被你获得  通过题中计算公式得出你的val  问  通过随 ...

  9. 模式识别 - 处理多个演示样本研究(MIL)特点(matlab)

    处理多个演示样本研究(MIL)特点(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习 ...

  10. delphi 回调函数

    program Project2; {$APPTYPE CONSOLE} uses SysUtils; type //定义一个对象事件方法 TCallbackFunc = function (i: I ...