zoukankan      html  css  js  c++  java
  • PHP之Memcache和Memcached

    本篇文章向大家介绍的是PHP中的Memcache和Memcached ,有兴趣的朋友可以看一下

    **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类

    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,永久缓存
    这种缓存方案比较适合于关于单独的页面,它的修改频率非常低,这时可以生成永久缓存

    相关推荐:

    php模块memcache和memcached区别分析_PHP教程

    原文:http://www.php.cn/php-weizijiaocheng-391225.html

  • 相关阅读:
    iPhone开发指南应用程序核心
    id,SEL,Nil,nil,IMP,Method,Class类型
    需求驱动赢得创新
    Linux内核list&hlist解读
    转载:x86的cpu_relax解析
    hadoop开发者第三期
    Hadoop开发者入门专刊
    Hadoop源代码eclipse编译指南
    高效的使用stl::map和std::set
    配置VIM语法高亮及自动缩进
  • 原文地址:https://www.cnblogs.com/lxwphp/p/11135069.html
Copyright © 2011-2022 走看看