• HOME
  • DOCS
  • WTF
  • TECH
  • LIFE
  • PAGES
    • ARCHIVE
    • TAGS
    • ABOUT
    • FRIENDS
    • RSS
  • TOOLS
    • GEO
    • RANDOM()
    • GOO.GL
    • CSS HEART
Aj's Blog

记录时间溜走的瞬间和折腾过的那些事

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小结
上一篇:   sshd+pam+authorized_keys组合常见问题汇总
暂无评论

Cancel reply