php memcache

**Memcache介绍:**Memcache是一套分布式缓存系统,分布式就是说能够在多台服务器上同时安装Memcache服务,这样能够达到很好的集群效果。高速,是由于Memcache数据都是维护在内存中的,它的读取速度比存储在硬盘中的数据的读取速度要快不少。 
做用:当咱们的应用访问量比较大的时候,数据库的压力也会特别大,Memcache能够在应用和数据库之间增长一个缓冲层,就是咱们以前从数据库中已经读取到的数据,咱们第二次或者是接下来再读取的时候,就能够直接访问Memcache去读取这些数据,从而减轻Mysql等等数据库的压力 
怎样理Memcache:其实能够理解成,它是一个只有一张表的数据库,这张表有两个字段,分别是key和value,value是保存的数据,key就是这个数据的ID,用来保证查找时的惟一性 
使用场景: 
(1)非持久化存储:对数据存储要求不高,也就是说,若是这份数据丢失,也不会对系统形成太大的影响,由于当系统断电或被重启后内存会被清空掉,那么以前保存在Memcache中的数据也会被清空掉。因此要把Memcache看成缓存使用,而不要当成真正的数据库 
(2)分布式存储:不适合单机使用,由于Memcache对内存的消耗很大,若是使用Memcache,推荐将其安装在另一台机器上单独做为缓存系统,而不要把Memcache和数据库都装到一台机器。 
(3)Key/Value存储:格式简单,不支持List、Array数据格式php

Memcached和Memcache是两个版本,推荐Memcached,它有更多的改进和功能函数,是Memcache的升级版本,速度和稳定性都比较高sql

安装Memcached 
1,Memcache服务端的安装 
(1)编译安装,Libevent Memcache 
先安装Libevent这个扩展,编译安装的好处就是能够在安装的过程进行一些自定义的设置,好比指定软件安装在哪儿,好比编译安装过程出现了哪些错误,而对Linux了解不是特别多的状况下,你可能处理错误的时候就会相对困难 
(2)使用依赖管理工具yum、apt-get进行安装数据库

实际安装:(操做系统是64位的Centos) 
若是要编译安装,须要将安装包提早下载下来libevent、memcached 
这里使用依赖管理工具安装缓存

#yum install memcached

启动memcached服务器

#/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root/*
    -d:守护进程的模式启动。守护进程就是,当你从终端窗口推出以后,程序依然进行    -l:指定IP地址    -p:指定端口号    -m:为memcached分配多少内存,这里是以M为单位    -u:以哪一个身份去启动memcached(线上的时候最好不要用超级管理员用户)*/

可使用ps查看memcached进程是否启动分布式

#ps -ef | grep memcached

2,Memcache客户端的安装 
1,安装前置扩展Libmemcached 
下载好libmemcached和memcached,对libmemcached进行解压 
这里使用编译安装,进入解压出来的文件夹 
执行memcached

#./configure --prefix=/usr/lib/libmemcached而后执行#make && makeinstall

2,为php安装memcached扩展 
解压memcached,进入到解压目录当中 
使用phpize的方式安装memcached扩展函数

#phpize此时就会作出一个configure的文件#./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached-sasl后边是指定php的配置文件和刚安装的libmemcached的位置,你们根据本身的配置文件路径进行填写#make#make install执行完make install以后,咱们会看见一个扩展目录,将该路径添加到php配置文件中
php.ini中加入
extension=memcached.so
而后重启服务器环境,查看php扩展#php -m | grep memecached

在PHP中使用memcached 
系统类:addServer、addServers、getStats、getVersion 
数据类:add、setdelete、flush、replace、increment、get 
进阶类:setMulti、deleteMulti、getMulti、getResultCode、getResultMessage 
更多关于memecached的操做,能够到php官网查看(php.net)工具

test.php<?php/*系统类*/$m = new Memcached();/*添加服务器*/$m->addServer('127.0.0.1', 11211);/*添加多台服务器*/$array = array(    array('127.0.0.1', 11211),    array('127.0.0.1', 11211)
);$m->addServers($array);/*查看服务器状态*/print_r($m->getStats());/*查看服务端版本号*/print_r($m->getVersion());/*数据类*/$m->add('mkey', 'mvalue', 0);//第三个参数是数据存在的时间,0表示永久echo $m->get('mkey');//获取数据/*假设对同一个key值进行两次添加的话,后边的操做不会覆盖前边的value,若是想替换掉,就使用replace*/$m->replace('mkey', 'mvalue2');/*还可使用set方法表添加数据,它的好处就是,当咱们的数据不存在时会帮咱们新建数据,若是存在,就会覆盖原值*/$m->add('mkey', 'mvalue', 600);/*删除数据*/$m->delete('mkey');/*清空memcache中的全部缓存*/$m->flush();/*对memcache中整形数据进行+1或+任意数值的操做*/$m->set('num', 5, 0);$m->increment('num', 5);//每次刷新页面,num自增5$m->get('num');/*自减decrement用法相同*//*下边的方法只支持Memcached,不支持Memcache*//*一次添加多条数据*///原始方法,屡次使用set()//如今可使用setMulti()$data = array(    'key' => 'value',    'key1'=> 'value1');$m->setMulti($data,0);$result = $m->getMulti(array('key','key1'));//获取多条数据print_r($result);//删除多条数据$m->deleteMulti(array('key','key1'));//返回上一次操做返回的编码(数字的形式存在) 能够到手册中查看每个编码的含义 echo $m->getResultCode();//好比  成功  返回0//获取操做结果echo $m->getResultMessage();//好比  成功  返回SUCCESS

封装一个本身的Memcache类网站

Memcached.class.php<?php/*
封装本身的Memcached类
1,扩展性
2,可调性
3,尽可能简便的操做,一个方法多种功能
*//*
经过一个s()方法实现set()、get()、delete()操做
set    s($key,$value,$time)
get    s($key)
delete s($key,NULL)
*/class Mem
{    private $type = 'Memcached';//考虑到扩展性,实例化的多是Memcache也多是Memcached
    private $m;    private $time = 0;    private $error;    private $debug = 'true';    public function __construct()
    {         if(!class_exists($this->type)){            $this->error="No ".$this->type;            return false;
        }else{            $this->m=new $this->type;
        }
    }    //添加服务器
    public function addServer($arr)
    {        $this->m->addServers($arr);
    }    public function s($key, $value='', $time=NULL)
    {        $number = func_num_args();//该函数用来判断传递过来了几个参数
        if($number == 1){            return $this->get($key);
        }else if($number >= 2){            if($value === NULL){//必定要使用“全等于”,由于若是不是全等于,传递过来0也会经过
                $this->delete($key);
            }else{                $this->set($key, $value, $time);
            }
        }
    }    private function set($key, $value, $time=NULL)
    {        if($time === NULL)            $time = $this->time();        $this->m->set($key, $value, $time);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }
    }    private function get($key){        $result = $this->m->get($key);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }        return $result;
    }    private function delete($key)
    {        $this->m->delete($key);
    }    public function getError()
    {        if($this->error){            return $this->error();
        }else{            return $this->m->getResultMessage();
        }
    }

}

项目中使用Memcache 
1,即时生成缓存 
比较适用于相似于新闻详情页,第一我的进入页面时,生成缓存,当后边的人再进入这个页面时,能够直接从缓存中获取数据,而且能够给数据设置一个过时时间,这样的话,等看这个新闻的人比较少的时候就能够及时清除缓存,这样能够达到节约内存的目的 
2,提早生成缓存 
这种生成缓存的方式,比较适用于访问量比较大且数据量比较多,相似于网站首页这种状况。可使用定时脚本的方式,提早将缓存生成 
3,永久缓存 
这种缓存方案比较适合于关于单独的页面,它的修改频率很是低,这时能够生成永久缓存

**Memcache介绍:**Memcache是一套分布式缓存系统,分布式就是说能够在多台服务器上同时安装Memcache服务,这样能够达到很好的集群效果。高速,是由于Memcache数据都是维护在内存中的,它的读取速度比存储在硬盘中的数据的读取速度要快不少。 
做用:当咱们的应用访问量比较大的时候,数据库的压力也会特别大,Memcache能够在应用和数据库之间增长一个缓冲层,就是咱们以前从数据库中已经读取到的数据,咱们第二次或者是接下来再读取的时候,就能够直接访问Memcache去读取这些数据,从而减轻Mysql等等数据库的压力 
怎样理Memcache:其实能够理解成,它是一个只有一张表的数据库,这张表有两个字段,分别是key和value,value是保存的数据,key就是这个数据的ID,用来保证查找时的惟一性 
使用场景: 
(1)非持久化存储:对数据存储要求不高,也就是说,若是这份数据丢失,也不会对系统形成太大的影响,由于当系统断电或被重启后内存会被清空掉,那么以前保存在Memcache中的数据也会被清空掉。因此要把Memcache看成缓存使用,而不要当成真正的数据库 
(2)分布式存储:不适合单机使用,由于Memcache对内存的消耗很大,若是使用Memcache,推荐将其安装在另一台机器上单独做为缓存系统,而不要把Memcache和数据库都装到一台机器。 
(3)Key/Value存储:格式简单,不支持List、Array数据格式

Memcached和Memcache是两个版本,推荐Memcached,它有更多的改进和功能函数,是Memcache的升级版本,速度和稳定性都比较高

安装Memcached 
1,Memcache服务端的安装 
(1)编译安装,Libevent Memcache 
先安装Libevent这个扩展,编译安装的好处就是能够在安装的过程进行一些自定义的设置,好比指定软件安装在哪儿,好比编译安装过程出现了哪些错误,而对Linux了解不是特别多的状况下,你可能处理错误的时候就会相对困难 
(2)使用依赖管理工具yum、apt-get进行安装

实际安装:(操做系统是64位的Centos) 
若是要编译安装,须要将安装包提早下载下来libevent、memcached 
这里使用依赖管理工具安装

#yum install memcached

启动memcached

#/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root/*
    -d:守护进程的模式启动。守护进程就是,当你从终端窗口推出以后,程序依然进行    -l:指定IP地址    -p:指定端口号    -m:为memcached分配多少内存,这里是以M为单位    -u:以哪一个身份去启动memcached(线上的时候最好不要用超级管理员用户)*/

可使用ps查看memcached进程是否启动

#ps -ef | grep memcached

2,Memcache客户端的安装 
1,安装前置扩展Libmemcached 
下载好libmemcached和memcached,对libmemcached进行解压 
这里使用编译安装,进入解压出来的文件夹 
执行

#./configure --prefix=/usr/lib/libmemcached而后执行#make && makeinstall

2,为php安装memcached扩展 
解压memcached,进入到解压目录当中 
使用phpize的方式安装memcached扩展

#phpize此时就会作出一个configure的文件#./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached-sasl后边是指定php的配置文件和刚安装的libmemcached的位置,你们根据本身的配置文件路径进行填写#make#make install执行完make install以后,咱们会看见一个扩展目录,将该路径添加到php配置文件中
php.ini中加入
extension=memcached.so
而后重启服务器环境,查看php扩展#php -m | grep memecached

在PHP中使用memcached 
系统类:addServer、addServers、getStats、getVersion 
数据类:add、setdelete、flush、replace、increment、get 
进阶类:setMulti、deleteMulti、getMulti、getResultCode、getResultMessage 
更多关于memecached的操做,能够到php官网查看(php.net)

test.php<?php/*系统类*/$m = new Memcached();/*添加服务器*/$m->addServer('127.0.0.1', 11211);/*添加多台服务器*/$array = array(    array('127.0.0.1', 11211),    array('127.0.0.1', 11211)
);$m->addServers($array);/*查看服务器状态*/print_r($m->getStats());/*查看服务端版本号*/print_r($m->getVersion());/*数据类*/$m->add('mkey', 'mvalue', 0);//第三个参数是数据存在的时间,0表示永久echo $m->get('mkey');//获取数据/*假设对同一个key值进行两次添加的话,后边的操做不会覆盖前边的value,若是想替换掉,就使用replace*/$m->replace('mkey', 'mvalue2');/*还可使用set方法表添加数据,它的好处就是,当咱们的数据不存在时会帮咱们新建数据,若是存在,就会覆盖原值*/$m->add('mkey', 'mvalue', 600);/*删除数据*/$m->delete('mkey');/*清空memcache中的全部缓存*/$m->flush();/*对memcache中整形数据进行+1或+任意数值的操做*/$m->set('num', 5, 0);$m->increment('num', 5);//每次刷新页面,num自增5$m->get('num');/*自减decrement用法相同*//*下边的方法只支持Memcached,不支持Memcache*//*一次添加多条数据*///原始方法,屡次使用set()//如今可使用setMulti()$data = array(    'key' => 'value',    'key1'=> 'value1');$m->setMulti($data,0);$result = $m->getMulti(array('key','key1'));//获取多条数据print_r($result);//删除多条数据$m->deleteMulti(array('key','key1'));//返回上一次操做返回的编码(数字的形式存在) 能够到手册中查看每个编码的含义 echo $m->getResultCode();//好比  成功  返回0//获取操做结果echo $m->getResultMessage();//好比  成功  返回SUCCESS

封装一个本身的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

Memcached.class.php<?php/*

封装本身的Memcached类

1,扩展性

2,可调性

3,尽可能简便的操做,一个方法多种功能

*//*

经过一个s()方法实现set()、get()、delete()操做

set    s($key,$value,$time)

get    s($key)

delete s($key,NULL)

*/class Mem

{    private $type = 'Memcached';//考虑到扩展性,实例化的多是Memcache也多是Memcached

    private $m;    private $time = 0;    private $error;    private $debug = 'true';    public function __construct()

    {         if(!class_exists($this->type)){            $this->error="No ".$this->type;            return false;

        }else{            $this->m=new $this->type;

        }

    }    //添加服务器

    public function addServer($arr)

    {        $this->m->addServers($arr);

    }    public function s($key, $value='', $time=NULL)

    {        $number = func_num_args();//该函数用来判断传递过来了几个参数

        if($number == 1){            return $this->get($key);

        }else if($number >= 2){            if($value === NULL){//必定要使用“全等于”,由于若是不是全等于,传递过来0也会经过

                $this->delete($key);

            }else{                $this->set($key, $value, $time);

            }

        }

    }    private function set($key, $value, $time=NULL)

    {        if($time === NULL)            $time = $this->time();        $this->m->set($key, $value, $time);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;

            }

        }

    }    private function get($key){        $result = $this->m->get($key);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;

            }

        }        return $result;

    }    private function delete($key)

    {        $this->m->delete($key);

    }    public function getError()

    {        if($this->error){            return $this->error();

        }else{            return $this->m->getResultMessage();

        }

    }

 

}

项目中使用Memcache 
1,即时生成缓存 
比较适用于相似于新闻详情页,第一我的进入页面时,生成缓存,当后边的人再进入这个页面时,能够直接从缓存中获取数据,而且能够给数据设置一个过时时间,这样的话,等看这个新闻的人比较少的时候就能够及时清除缓存,这样能够达到节约内存的目的 
2,提早生成缓存 
这种生成缓存的方式,比较适用于访问量比较大且数据量比较多,相似于网站首页这种状况。可使用定时脚本的方式,提早将缓存生成 
3,永久缓存 这种缓存方案比较适合于关于单独的页面,它的修改频率很是低,这时能够生成永久缓存

相关文章
相关标签/搜索