MemCache

头像
like
    阅读 12 分钟

    一、memcache的介绍

    1、memcached基本概念

    (1)Memcached是danga的一个项目,最早是LiveJournal服务的,最初为了加速LiveJournal访问速度而开发的,后来被很多大型的网站采用。

    官方网站: www.danga.comhttp://memcached.org

    (2)Memcached是一个高性能的分布式的内存对象缓存系统,

    用于构建大负载的网站,来分担数据库的压力,

    简单的说就是将频繁访问的数据存储到内存中,然后从内存中读取,从而大大提高读取速度。

    学习资源:http://www.runoob.com/memcach...

    2、基本原理

    image-20200719111321101

    当前客户端首次访问热点新闻时,从数据库里面取出,并把该热点信息数据给给缓存到服务器的内存里面,后续用户访问时,直接从内存里面获取数据,返回即可。

    image-20200719111920296

    3、与mysql比较

    (1)与mysql一样,是一个c(client)/s(server)架构的软件。

    (2)mysql里面的数据,是存储到硬盘里面的,memcache里面的数据是存储到内存里面的,

    服务器一旦断电后重启,则存储到内存里面的数据就丢失。

    (3)数据存储到mysql里面,则需要先建立数据库,建立表,设计字段。在memcache里面数据的存储形式是key,value方式,(键值对方式),可以理解成两列的表。

    name 小刚

    age 12

    email xiaoganggang@sohu.com

    二、安装

    image-20200719113726637

    先下载软件,拷贝到一个具体位置,一般是和环境软件在一块。

    image-20200719114159071

    1. 以管理员的方式,进入cmd,并进入到memcached软件所在的目录

      通过memcached -h 查看安装成服务的一些指令

    image-20200719114257745

    1. 执行memcached –d install进行安装

      image-20200719114659573

    2. 安装完成后,进入启动

      image-20200719114731991


    windows下dos命令窗口输入netstat -ano即可查看端口使用情况,

    如果要查看指定端口是否被占用可以使用命令

    netstat -ano|findstr 端口号

    image-20200719115141701

    注意:也可以无需安装,直接启动memcache软件

    image-20200719115501358

    三、操作memcache软件

    1、使用客户端连接memcache

    语法:

    telnet   ip地址  端口号

    按回车出现如下界面链接成功,

    image-20200719134109034


    若提示“telnet不是内部或外部指令”

    解决:安装本电脑的telnet客户端服务即可。

    控制面板--->程序和功能--->打开或关闭windows服务--->Telnet客户端

    image-20200719133504530


    使用其它工具通过telnet协议连接memcache

    image-20200719133640330

    image-20200719133716127

    2、设置数据

    1、添加数据

    语法:

    add key 0|1 失效时间 数据长度


    key :键的名称

    0|1:是否压缩,0表示不压缩,1表示要压缩,

    失效时间:缓存周期,单位是秒

    数据长度:单位是字节,

    image-20200719134646525

    注意:使用add指令,添加数据时,如果键已经存在,则添加失败

    image-20200719134830381

    2、修改数据

    语法:

    replace key 0|1 失效时间 数据长度

    image-20200719135133134

    注意:在修改时,如果键不存在,则修改失败。

    image-20200719135209485

    3、设置数据

    语法:

    set key 0|1 失效时间 数据长度

    使用set 操作,如果键已经存在,则是修改,如果键没有存在,则是添加。

    3、获取数据

    语法:

    get 键名

    4、删除数据

    删除单个数据

    delete key

    image-20200719135745877

    删除所有数据,(在实际工作中,要慎用)

    flush_all

    image-20200719135815151

    image-20200719140108934

    5、其它指令

    incr :加法操作,相加指定的值,返回相加后的结果,

    语法:incr key value

    decr :减法操作,减去指定的值,返回相减后的结果,

    语法:decr key value

    image-20200719140435600


    可以使用该指令来模拟抢购,

    比如有1000件商品,在60秒完成抢购,

    set number 0 60 4

    1000

    用户抢购一次,数值减一,当减到0时,抢购结束。

    decr number 1

    6、状态指令

    语法命令:stats

    image-20200719140613401

    主要通过该命令来计算memcache的效率(命中率)

    命中率计算:get_hist/cmd_get

    如果命中率非常低,则说明memcache低效。需要调整缓存的数据。

    7、失效时间

    image-20200719141319138

    失效时间,有两种设置方式:

    (1)时间间隔(秒数)。 时间间隔 最大不能超过2592000秒(30天)。

    (2)失效的时间戳。 大于当前时间戳才有效。


    案例1:比如我们要设置一个缓存项,想要缓存20天,应该如何设置

    第一种方式,使用时间间隔    20*24*3600
    
    第二种方式:使用时间戳  time()+20*24*3600

    案例2:比如我们要设置一个缓存项,想要缓存40天,应该如何设置

    此时就只有一种方式,使用到期的时间戳。time()+40*24*3600

    注意:时间间隔与时间戳都是整数,如何来区别呢?

    如果整数小于2592000,则是时间间隔

    如果要使用时间戳,则必须大于当前的时间戳。

    8、key与value的限制

    设置key的长度不要超过250个字节。value的大小不要超过1MB的数据。

    image-20200719152036510

    四、使用php来操作memcache

     1、安装memcache扩展

    memcached这个扩展是memcache扩展的升级版。

    windows环境下memcached没有dll扩展,那你想在windows下跟memcache这个产品通信怎么办?

    那就只能装memcached扩展的前身,memcache.dll。


    实际项目中会在php代码层面判断运行环境拥有哪个拓展就调用哪个
    开发环境大多是WIN,就用memcache
    生成环境大多Linux,就用memcached

     if (extension_loaded('memcached')) {
            $this->cache = new \Memcached; 
        }else if(extension_loaded ('memcache'))
            $this->cache = new \Memcache;  
        else{
            $this->active = false;
            Log::error('Cache not support!');
            return false;
        }
    1. 准备扩展文件

    通过phpinfo()函数查看php的版本。

    image-20200719144623190

    注意: 扩展文件要和php的版本相对应。

    image-20200719145100431

    1. 把对应的扩展文件,拷贝到php的安装目录的ext目录里面。

    image-20200719145213041

    1. 打开php.ini配置文件,进行配置加载memcache的扩展。

      image-20200719150142122

    2. 重启apache,通过phpinfo 函数进行测试,如果出现如下提示,则证明已经安装成功。

    image-20200719150218212

    2、入门测试

    在php的手册里面,给我们提供了一个memcache的类,使用该类的一些方法完成操作。

    image-20200719150605977

    image-20200719151104128

    image-20200719151121547

    获取数据

    image-20200719151318901

    注意点:

    在使用memache类操作时,里面的方法有些是和命令是不一样的。

    比如

    $res = $mem->getStats();

    $res = $mem->increment();

    image-20200719151724644

    image-20200719151751440

    3、php数据类型探讨存入memcache

    php数据类型有标量和非标量

    标量:整型 小数型 字符串 布尔

    非标量:数组 资源 对象 null

    1. 标量数据,存储到memcache里面

    image-20200719152808664

    说明:如果是标量数据存储到memcache里面,则取出数据时,保持原样类型。


    1. 非标量数据,存储到memcache里面

    image-20200719153320240

    image-20200719153801088

    非标量数据:序列化后再存入到memcached服务器中,得到时反序列化工作。

    序列化与反序列化过程,是由memcache的扩展完成的,无需我们自己干预。

    image-20200719153922812


    什么是序列化:

    就是在保存数据时,不但保存数据本身,还保存数据类型。

    a.利于在网络间进行数据传输

    b.便于重新读取并恢复数据

    Memcached本身没有数据类型之分(内部都是以字符串的形式处理的)

    但是,php是存在数据类型。

    总结:除了资源类型之外,其他的类型我们都可以存储,当然一般是存储字符串数组

    4、案例1:缓存sql语句的执行结果

    image-20200719155415112

    5、案例2:缓存新闻详情内容

    image-20200719160133278

    新闻列表页

    image-20200719160244945

    新闻详情页

    image-20200719160554114

    6、memcache在tp5框架中使用

    ThinkPHP采用think\Cache类(实际使用think\facade\Cache类即可)提供缓存功能支持。

    内置支持的缓存类型包括file、memcache、wincache、sqlite、redis和xcache。

    在配置目录下面的cache.php文件中,进行如下配置:

    image-20200719164522433

    image-20200719165344816

    image-20200719165402229

    image-20200719165728293

    image-20200719165804993

     public function del()
     {
        $res = Cache::rm('age');
        dump($res);
     }

    image-20200719170125019

    五、memcache分布式配置

    1、简介说明

    Memcached是一个高性能的分布式的内存对象缓存系统

    每台服务器写、读操作都有

    把对memcache的许多操作平均地给各个分支服务器完成

    memcache可使用的内存空间是多个服务器空间的“算术和”

    img

    image-20200719171756591

    php无需关心具体操作是那个memcache服务器,在memcache内部有具体算法,帮助php实现具体分发(操作的memcache)

    image-20200719171945684

    2、具体搭建步骤使用

    分布式的多个memcache服务搭建:

    ① 在一台服务器里边开启多个memcache服务

    ② 给多台服务器分别安装memcache服务

    环境搭建:至少需要两台memcache服务器,

    第一台:localhost 11211端口的

    第二台:localhost 8888

    image-20200719172154013

    设置数据代码:

    $mem = new Memcache();
    //连接三台memcache服务器
    $mem->addServer('192.168.1.100',11211);
    $mem->addServer('192.168.1.200',11211);
    $mem->addServer('192.168.1.210',11211);
    //设置缓存数据
    $mem->set('name','xiaogang',0,3600);
    $mem->set('age', 12, 0, 3600);
    $mem->set('email', 'xiaogang@souhu.com', 0, 3600);
    $mem->set('height',189,0,3600);

    获取数据

    $mem = new Memcache();
    //连接三台memcache服务器
    $mem->addServer('192.168.1.100',11211);
    $mem->addServer('192.168.1.200',11211);
    $mem->addServer('192.168.1.210',11211);
    //取数据
    $name = $mem->get('name');
    $age = $mem->get('age');
    $email = $mem->get('email');
    $height = $mem->get('height');

    需要注意:

    存储和获取数据时,根据一个算法,来计算存储到哪台服务器,或从哪台服务器取出数据。

    默认使用取模算法,在存储数据时,根据数据的键,转换成数字和memcache服务器的个数取模,取模的结果,就决定向哪台服务器存储。

    在取出数据时,也是根据键,转换成数字,和memcache服务器的个数取模,取模的结果,就决定向哪台服务器获取数据。

    六、session数据存入memcache

    需要在php.ini文件里面进行配置,session数据入memcache.

    (1)session.save_handler 配置session的存储方式。

    (2)session.save_path 指定session的存储位置

    image-20200719174505701

    image-20200719174534859

    我们可以使用一个函数ini_set(),完成php.ini里面的一些配置,该配置只能在当前页面有效。

    ini_set('session.save_handler','memcache');
    
    ini_set('session.save_path','tcp://localhost:11210');

    存储数据的代码:

    image-20200719175245413

    注意:把session数据存储到memcache里面,是以session_id为键的。

    image-20200719175314116

    获取数据的代码:

    image-20200719175341041

    七、其他问题

    1、memcache适合存储哪些数据

    (1)访问比较频繁的数据,安全性差的数据,丢失无所谓的数据。

    (2)数据更新,比较频繁的数据,比如用户的在线状态。

    (3)数据的单个键值不能太大,不要超过1Mb数据。

    2、惰性删除

    Lazy Expiration

    memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过

    期。

    这种技术被称为lazy(惰性)expiration。

    因此,memcached不会在过期监视上耗费CPU时间

    3、最近最少使用原则

    LRU,least Recently Used,最近最少使用原则。

    memcache在插入新数据时,如果空间不足时,采用删除旧缓存项策略,删除最不活跃的缓存项。

    4、安全性的问题

    在memcache里面,没有设置安全认证机制,因为memache就是专做缓存使用,主要突出缓存优势。

    一般情况下,memcache服务器是在内网中的,不会暴露在公网中,因此一些恶意用户就无法操作memcache服务器。

    image-20200719180456728

    -l 连接的IP地址, 默认是本机

    image-20200719180605862

    5、缓存雪崩问题

    如果在设置缓存周期时,设置的缓存周期都一样,当正好赶上高并发时,如果缓存都同时失效,则会把请求涌向mysql服务器,mysql服务器有可能会出现宕机现象

    解决方案:设置不同的缓存周期。

    image-20200719180901637

    八、Linux环境下安装

    Linux系统安装memcached,首先要先安装libevent库。

    yum install libevent libevent-devel

    注:因为memcached依赖于libevent库,因此,需要先编译libevent

    编译Memcached时,要指定Libevent

    1、安装libevent软件

    (1)下载libevent软件,上传到linux服务器,解压

    tar -zxvf libevent-2.0.21-stable.tar.gz

    (2)进入解压目录

    cd libevent-2.0.21-stable

    image-20200719182833555

    (3)进行配置

    ./configure --prefix=/usr/local/libevent

    image-20200719182850624

    4)编译安装

    make && make install

    image-20200719182909458

    2、安装memcache

    (1)解压

    tar -zxvf memcached-1.4.24.tar.gz

    (2)进入解压的目录

    cd memcached-1.4.24

    image-20200719183151506

    (3)配置

    ./configure --prefix=/usr/local/memcache --with-libevent=/usr/local/libevent

    image-20200719183224242

    (4)编译安装

    make && make install

    image-20200719183251867


    注意,linux下面memcache的安装位置,启动时,使用bin目录下面的memcached启动;

    image-20200719183617462

    启动:

    image-20200719183329334

    -d选项是启动一个守护进程,

    -m是分配给Memcache使用的内存数量,单位是MB,默认是64MB

    -u是运行Memcache的用户,

    -l是监听的服务器IP地址,

    -p是设置Memcache监听的端口,默认是11211,最好是1024以上的端口

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

    -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid

    -M关闭最近最少使用原则,当空间不足时,就返回一个错误;

    image-20200719183409485


    like
    42 声望1 粉丝

    下一篇 »
    页面静态化