|
一、需求描述
一linode xen vps 1G RAM,40+sites,IO频繁,openfilesulimit已65535
US时间访问量大增,nginx不定时502
二、解决办法
pages cache化,但这一台vps内存不够用,于是把闲置的几台服务器都装上memcached做缓存集群
再根据网络延迟设定权重
memcached server官方: http://memcached.org/
三、代码
访问memcached server需要php支持,可以选择memcached库和memcache库,注意2者名字的区别
详细对比:https://code.google.com/p/memcached/wiki/PHPClientComparison
我采用的是php memcache:http://php.net/manual/en/book.memcache.php因为memcache不依赖libmemcached
1
2
3
4
5
6
7
8
9
10
11
| //集群数组
$memserver=array(
array('host'=>'fast1.xxx.com','port'=> 13579 ,'weight'=> 40 ),
array('host'=>'fast2.xxx.com','port'=> 13579 ,'weight'=> 20 ),
array('host'=>'fast3.xxx.com','port'=> 13579 ,'weight'=> 20 ),
array('host'=>'slow1.xxx.com','port'=> 24680 ,'weight'=> 5 ),
array('host'=>'slow2.xxx.com','port'=> 24680 ,'weight'=> 5 ),
array('host'=>'local.xxx.com','port'=> 11211 ,'weight'=> 10 )
);
|
键值读、写、删就没什么说的了直接按文档sample写即可
考虑到以后的移植问题,记得首先检测环境是否支持memcache: class_exists(‘Memcache’)
下面是我的实现,因为特定需求,几个函数写的相对独立,memcache也没做全局实例化。
你可以根据自己需求把memcache在全局实例化,优化操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| //---getcontent from memcache---
functiongetCache($key)
{
Global$memserver;
$ret= false;
$key= md5($key);
$mc=newMemcache();
foreach($memserveras $s )
$mc->addServer($s['host'],$s['port'],FALSE,$s['weight']);
$ret=$mc->get($key);
$mc->close();
unset($mc);
return$ret;
}
//---setcontent from memcache---
functionsetCache($key,$val)
{
Global$memserver;
$ret= false;
$key= md5($key);
$mc=newMemcache();
foreach($memserveras $s )
$mc->addServer($s['host'],$s['port'],FALSE,$s['weight']);
if(isset($val['cached']))
{
$val['cached']= 1;
$ret=$mc->set($key,$val);
}
$mc->close();
unset($mc);
return$ret;
}
//---deletecontent from memcache---
functiondelCache($key)
{
Global$memserver;
$ret= false;
$key= md5($key);
$mc=newMemcache();
foreach($memserveras $s )
$mc->addServer($s['host'],$s['port'],FALSE,$s['weight']);
$ret=$mc->delete($key, 0);
$mc->close();
unset($mc);
return$ret;
}
|
|
|
|