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. DELPHI SOKET 编程(使用TServerSocket和TClientSocket)

    本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...

  2. 【MongoDB】学习MongoDB推荐三本书

    近期学习mongodb,感觉这三本书写得不错.非常大家分享一下:

  3. If-Modified-Since页面是否更新

    第一次先请求某个网页,抓取到本地,假设文件名为 a.html.这时文件系统有个文件的修改时间. 第二次访问网页,如果发现本地已经有了 a.html,则向服务器发送一个 If-Modified-Sinc ...

  4. RF+Selenium2Library+Sikuli集成环境搭建

    Sikuli是通过截图来编写代码的脚本语言,他是对于Selenium不好处理的一些模态窗口.flash等的利器.废话少说,直接开始安装吧.安装RF+Selenium2Library的环境这里就不说了, ...

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

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

  6. TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...

  7. [Windows Phone学习笔记]页面之间传递对象

    在Windows Phone中,页面之间传递参数就类似Web开发中一样,通过QueryString的形式进行传递,但是如果需要传递对象,则无法通过QueryString形式了,其实也可以,把对象序列化 ...

  8. [Android学习笔记]使用getIdentifier()获取资源Id

    使用getIdentifier()获取资源Id Android中可以使用getIdentifier()获取资源ID ex: 根据图片名称获取图片Id private int getImageResId ...

  9. 在navigationItem中添加搜索栏

    给navigationItem中添加个搜索栏,效果和大部分程序一样.代码如下: UISearchBar *searchBar = [[UISearchBaralloc] initWithFrame:C ...

  10. 浅谈 PHP 变量可用字符

    原文:浅谈 PHP 变量可用字符 先来说说php变量的命名规则,百度下一抓一大把:(1) PHP的变量名区分大小写;(2) 变量名必须以美元符号$开始;(3) 变量名开头可以以下划线开始;(4) 变量 ...