MemCache

一、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 [email protected]

二、安装

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', '[email protected]', 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

你可能感兴趣的:(memcached)