zoukankan      html  css  js  c++  java
  • php memcached缓存集群

    一、需求描述

    一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 ;
    }
  • 相关阅读:
    谈谈编译和运行
    全国车辆违章查询API文档及demo
    两款模拟键盘输入和鼠标点击的命令行工具
    利用AFNetworking框架去管理从聚合数据上面请求到的数据
    谈 API 的撰写
    谈 API 的撰写
    (四)Oracle条件查询,分页查询
    (三)Oracle字符串操作
    (二)Oracle数据库原理
    (一)Oracle安装详解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3190181.html
Copyright © 2011-2022 走看看