memcached的入门及应用

总结

源码编译方式的软件安装三部曲:

1、下载(找官网)、解压、进入解压后的目录

2、编译参数

3、make && make install安装

php扩展安装舞步曲:

1、下载(找pecl)、解压、进入解压后的目录

2、使用php自带的二进制脚本phpize弄成可编译的

3、编译参数

4、make && make install安装

5、将扩展添加到php.ini中,重启php,看php -m中是否添加成功

redis和memcache的区别:
1、memcache重启后数据丢失
2、redis不会,redis持久化

memcache

什么是memcache:

分布式高速缓存系统。可以在多台服务器安装就是分布式,可以在达到很好的集群效果

是应用和数据库中间的缓冲层:第1次走数据库,然后存到memcache中,之后就从memcache读取(当然会涉及到是否过期等问题)

我的理解:memcache是一张只有2个字段的表。Keyid)和value(值)字段

在什么时候使用memcache:

1、非持久化存储:对数据存储要求不高(断电或服务器重启会给内存清空)

2、分布式存储:不适合单机使用(因为很吃内存,非要单机的话,专门找个服务器做memcache不要将数据库和memcahe装在同一台服务器

3、key/value存储:格式简单、不支持list、array等数据格式

知道怎样使用memcache优化网站或api:

定期查看缓存的分布情况和击中情况,根据查询结果进行优化

项目中使用memcache:

1既时生成缓存适用于:新闻、详情页等静态资源页。第1个用户进来的时候生成缓存,在进来的n个人就直接走缓存。设置个时间,当过了1星期,可以直接在缓存中删除

2提前生成缓存适用于:首页。访问量较大,数据量又比较多的情况。使用linux定时脚本的方式提前生成缓存

3永久缓存适用于:关于我们,这种单独的页面,修改频率相当低,只有当修改了,才从新生成缓存

使用memcache的思路:

以及时生成缓存为例:

思路:先查询memcache中有没有对应的缓存(就是判断属性中有无)。

有就返回。

没有就查询,查询的时候设置一份存到属性中。

每次新增数据成功以后,删掉旧的缓存


安装:

我的环境是阿里云ecs,centos7.2的,装的一键lnmp

安装服务端

官网: http://memcached.org/


wget  http://www.memcached.org/files/memcached-1.5.5.tar.gz   //1、下载

tar xf memcached-1.5.5.tar.gz                   //2、解压

cd memcached-1.5.5                        //切换进入解压目录

yum install libevent-devel -y                   //安装依赖

./configure --prefix=/usr/local/Memcached             //3、编译参数

make && make install                       //4、安装

启动:

注意:memcache没有配置文件,所以要在启动中输入

./memcached -u root -p 11211 -P /var/run/memcached.pid -d #此启动所有的ip都可以连接

/usr/local/Memcached/bin/memcached -u root -p 11211 -P /var/run/memcached.pid -l ip -d

-u 指定运行用户(线上最好不要经常使用root

-p运行端口(小写),最好是1024以上的端口

-P pid文件(大写)

-d 守护进程 daemon 运行  

-l memcache服务器的内网ip才可登陆,指定一个ip(用本机)

-m memcache分配多少内存,单位兆(配置低分150

-c是最大运行的并发连接数,默认是1024;


连接测试:


telnet 127.0.0.1 11211 #ip输入 上面-l的参数

set key 0 0 5 //存数据

hello

get key      //取数据

quit  #退出telnet

注意:重启后memcached数据丢失


安装扩展

http://pecl.php.net   扩展都在这里下载

memcache 

memcached extension

memcached 

PHP extension for interfacing with memcached via libmemcached library

第1个是完全在PHP框架内开发的memcachephp手册中的

第2个是使用libmemcachedmemecached(推荐用这个,性能更好)

wget  http://pecl.php.net/get/memcached-3.0.0.tgz    //1、下载

tar xf memcached-3.0.0.tgz        //解压

cd memcached-3.0.0        //切换进解压后的目录

/usr/local/php/bin/phpize  //2、二进制脚本工具,使用这工具后就可以编译参数了

yum install libmemcached-devel –y  //安装依赖

./configure --with-php-config=/usr/local/php/bin/php-config  //3、编译参数

make && make install        //4、安装

配置 php.ini

extension_dir = /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/ #所有扩展基本都在这个目录下,这个目录引入一次即可

extension = memcached.so   //5、将扩展添加到配置文件中

结果:

重启服务器

输入php -m 查看扩展




memcache类的操作和封装

注意:php中有2个memcache类,我用的memcached

主要分为2大类:1、系统类 2、数据类 

1、系统类



    


因为这个服务器是不存在的

2、数据类



3、优雅快速的使用memcache



4、封装自己类的总结

1、扩展性 2、可调试 3、尽量简便的操作,一个方法多种功能(用swtich判断,调不同的方法)

<?php
/**
 * 封装自己的memcache类
 * 封装的目的是为了切换缓存引擎, 比如改用redis, 开发中使用的类调用的方法名一样,但是内部实现调用的是不同的引擎(工厂模式的思想)。
 */

class Mem{
    private $type = 'Memcached';
    private $m; //实例化的对象
    private $time = 0;      //缓存时间
    private $error;     //错误
    private $debug = 'true';

    public function __construct()
    {
        if(!class_exists($this->type)){
            $this->error = $this->type.'类不存在';
            return false;
        }else{
            $this->m = new $this->type;
        }
    }

    /**
     * 添加多台服务器
     * @param $arr 是个二维数组
     */
    public function ads($arr){
        $this->m->addServers($arr);
        //如果返回结果是一个对象,并且对象某个属性的值还对,就是添加成功
    }

    /**
     * 思想:传不同的参数,调用同一个方法,实现不同的功能
     * @param $key
     * @param $value
     * @param $time
     */
    public function s($key,$value='',$time=null){
        //传过来的参数是1个,那就是get方法
        if(func_num_args() == 1){
            //注意:这里不用$this->debug,是因为默认为true直接就进if然后return了,然后下面就不会执行了,所以他打印不出来
            return $this->m->get($key);     //【查】
            //注意:加这也没效果,上面有return也是直接返回了。不知道老师是get方法中加debug是啥意思??
        } else if(func_num_args() >= 2){
            if($value === null){
                $this->m->delete($key);     //【删】
            }else{
                if($time === null){
                    $time = $this->time;    //用属性中缓存的时间
                }
                $this->m->set($key,$value,$time);   //【加】
                return $this->debug();     //注意:这到无所谓,顶多上面执行完咯,有错误返回错误。但也要调用s方法得时候用echo输出下
            }
        }
    }

    private function debug(){
        //开启调试模式才返回错误信息
        if($this->debug){
            if($this->m->getResultCode() != 0){
                return $this->m->getResultMessage(); //直接返回错误信息
            }
        }
    }


    /**
     * 错误处理的方法
     */
    public function getError(){
        if($this->error){
            return $this->error;
        }else{
            return $this->m->getResultMessage();
        }
    }
}

调用方法:用浏览器访问,方便看

<?php
/**
 * 调用自己封装的memcache类
 * 封装的目的是为了切换缓存引擎, 比如改用redis, 开发中使用的类一样,但是内部实现调用的是不同的引擎。
 */

//思想:传不同的参数,调用同一个方法,实现不同的功能
include 'Mem.php';
$obj = new Mem();
$obj->ads([['127.0.0.1',11211]]);            //添加服务器
$obj->s('h1','yangxi',0);   //传3个参数是set【设置】
//$obj->s('h1',null);                        //传2个参数是delete【删除】
echo $tmp = $obj->s('h1');              //传1个参数是get【获取】
echo "<br />";
echo $obj->getError();                    //获取错误





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值