欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php memcached缓存集群

程序员文章站 2022-03-31 13:07:43
...

一、需求描述 一linode xen vps 1G RAM,40sites,IO频繁,openfilesulimit已65535 US时间访问量大增,nginx不定时502 二、解决办法 pages cache化,但这一台vps内存不够用,于是把闲置的几台服务器都装上memcached做缓存集群 再根据网络延迟设定权重 memcache

一、需求描述

一linode xen vps 1G RAM,40+sites,IO频繁,openfiles ulimit已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

//---get content from memcache---

function getCache( $key )

{

Global $memserver;

$ret = false;

$key = md5( $key );

$mc = new Memcache();

foreach ( $memserver as $s )

$mc->addServer( $s['host'], $s['port'], FALSE, $s['weight'] );

$ret = $mc->get( $key );

$mc->close();

unset( $mc );

return $ret;

}

//---set content from memcache---

function setCache( $key, $val )

{

Global $memserver;

$ret = false;

$key = md5( $key );

$mc = new Memcache();

foreach ( $memserver as $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;

}

//---delete content from memcache---

function delCache( $key )

{

Global $memserver;

$ret = false;

$key = md5( $key );

$mc = new Memcache();

foreach ( $memserver as $s )

$mc->addServer( $s['host'], $s['port'], FALSE, $s['weight'] );

$ret = $mc->delete( $key , 0);

$mc->close();

unset( $mc );

return $ret;

}