php之memcache学习


简介:

memcache是一个分布式高速缓存系统。

  分布式是说可以部署在多台服务器上,实现集群效果;

  高速是因为数据都是维护在内存中的;


特点和使用场景:

  1、非持久化存储:对数据存储要求不高(断电或重启后数据会清空);

  2、分布式存储:不适合单机使用(单机使用消耗内存,建议单独做一台memcache服务器,和mysql服务器分开);

  3、Key/Value存储:格式简单,不支持List、Array数据格式。


安装:

  1、编译安装 Libevent Memcache

  2、使用依赖管理工具 yum、apt-get

  建议使用memcached,而不再使用memcache。

CentOs: sudo yum install memcached

Ubuntu :sudo apt-get install memcached


启动:

  CentOs:

/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root

(说明:-d以守护进程方式启动,-l指定IP地址,-p指定端口号,-m分配的内存,-u以哪个用户运行memcache)。

  ubuntu:

memcached -d -l 127.0.0.1 -p 11211 -m 150 -u test

查看memcached是否安装:  

ps aux | grep memcached

或者

ps -ef | grep memcached

ps aux 是用BSD的格式来显示 java这个进程

显示的项目有:USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND

ps -ef 是用标准的格式显示java这个进程

显示的项目有:UID , PID , PPID , C , STIME , TTY , TIME , CMD

查看mamcached是否启动成功:

telnet 127.0.0.1 11211

然后结果如下:

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Escape character is '^]'.是一个提示,提示你使用Ctrl键+]键可以呼出telnet的命令行,

在telnet命令行输出quit可以退出telnet命令行。

停止memcached服务:

sudo kill PID

杀掉memcached的进程,kill 后跟的是memcached的进程号。

然后再telnet则显示:

Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

memcached客户端的安装

  1、安装Libmemcached。

  2、为php安装memcached扩展。

  centos:

  这次以编译安装方式:

    (1)下载安装包,libmemcached-1.0.18.tar.gz。

    (2)解压:tar zxvf libmemcached-1.0.18.tar.gz。

    (3)进入目录:cd libmemcached-1.0.18。

    (4)生成编译文件并指定路径:./configure --prefix=/usr/lib/libmemcached。

    (5)编译、安装:make && make install。

  安装php扩展:

    (1)下载安装包,打开php扩展官网,https://pecl.php.net/。搜索memcached,

      然后找到复制下载链接,

      例如:https://pecl.php.net/get/memcached-2.2.0.tgz。

wget https://pecl.php.net/get/memcached-2.2.0.tgz

    (2)解压:tar zxvf memcached-2.2.0.tgz。

    (3)进入目录:cd memcached-2.2.0。

    (4)使用phpize安装:phpize。

    (5)生成编译文件并指定路径:./configure。

    (如果报错提示找不到php-config或者找不到libmemcached,则需要指定自己的配置路径)

      ./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached=/usr/lib/libmemcached

      根据自己实际情况配置路径。

      如果提示不支持 sasl.h 就需要增加个参数 --disable-memcached-sasl。

      如果报:

      pkg-config not found

      configure: error: Please reinstall the pkg-config distribution,

      就安装pkg-config。

    (6)编译:make。

    (7)安装:make install,会看到结果:

Installing shared extensions:     /usr/lib/php5/20121212/

    (8)执行完成后,会显示出扩展得路径,打开php.ini,

      追加memcached扩展:extension=memcached.so。

      重启php服务,就可以通过phpinfo,看到memcached扩展。

sudo service php5-fpm restart

  Ubuntu:

     sudo apt-get install libmemcached

如果报如下错误:  

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package libmemcached is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'libmemcached' has no installation candidate

  添加了许多软件源依然没有解决,所以使用上边编译安装的方式安装。


php中使用memcache:

  系统类:addServer,addServers,getStats,getVersion。

  数据类:add,set,get,delete,flush,replace,increment。

  进阶类:setMulti,deleteMulti,getMulti,getResultCode,getResultMessage。


Thinkphp3.2使用memcached:

方式一:直接调用php的扩展memcached类:

$mc = new \Memcached();
$mc->addServer("localhost", 11211);

$mc->set("foo", "Hello!");
$mc->set("bar", "Memcached...");

$arr = array(
    $mc->get("foo"),
    $mc->get("bar")
);
var_dump($arr);

方式二:调用ThinkPHP自带的 Think\Cache\Driver\Memcached.class.php类。

    public function test(){
        $mem_config = array(
                'servers'=>[['127.0.0.1',11211]],
                'prefix'=>'think',
                'expire'=>3600
        );
        $mc = new \Think\Cache\Driver\Memcached($mem_config);
                //设置
        $mc->set("foo3", "Hello memcached!");
                //获取
        $a = $mc->get("foo3");                
        var_dump($a);
                //删除
        $mc->rm('foo3');
        $a = $mc->get("foo3");                
        var_dump($a);
    }    

方式三:使用tp的S方法,直接在控制器中使用:

    public function test(){
        //配置memcached参数
        $mem_config = array(
            'type'=>'memcached',
            'servers'=>[['127.0.0.1',11211]],
            'prefix'=>'think',
            'expire'=>3600
        );
        //设置缓存
        S($mem_config);
        //设置变量
        S('foo2','hello2');
        //读取变量
        $a = S('foo2');
        var_dump($a);
    }

方式四:使用tp的S方法,在配置文件config.php中设置全局的缓存:

    //缓存配置
    'DATA_CACHE_TYPE' => 'Memcached',
    'MEMCACHED_SERVER' => array(
        array('127.0.0.1', 11211, 0)
    ),
    'DATA_CACHE_TIME'       =>  3600,      // 数据缓存有效期 0表示永久缓存
    'DATA_CACHE_PREFIX'     =>  'think_',     // 缓存前缀