php memcached缓存集群 2013-06-17 @ TECH memcachedmemcahemulti serverphp
一、需求描述
一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
//集群数组 $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在全局实例化,优化操作。
//---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; }
下一篇: 2013.05-06小结
暂无评论