您的位置:首页 > 数据库 > Memcache

LNMP架构之PHP——MemCache对PHP页面的缓存加速优化

2019-05-08 15:02 1871 查看

前言

1.什么是MemCache?

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。

它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。

MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。

另外,说一下MemCache和MemCached的区别:

1)MemCache是项目的名称
2)MemCached是MemCache服务器端可以执行文件的名称

2.MemCache访问模型

特别澄清一个问题,MemCache虽然被称为"分布式缓存",但是MemCache本身完全不具备分布式的功能,MemCache集群之间不会相互通信(与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的"分布式",完全依赖于客户端程序的实现,就像上面这张图的流程一样。

同时基于这张图,理一下MemCache一次写缓存的流程:

  • 1)应用程序输入需要写缓存的数据

  • 2)API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号

  • 3)由服务器编号得到MemCache及其的ip地址和端口号

  • 4)API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作

读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。

这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

缓存加速优化配置过程

实验环境:

主机名 IP 相关配置要求
虚拟机server1 172.25.6.1 源码编译好的Mysql、Nginx、PHP
物理机 172.25.6.250 测试端

注:以下配置过程中使用到的相关资源是建立在PHP源码编译成功的基础上(作者是接着前面的博客写的,如果有什么疑问可以参考前面的文章)

1.下载一个memcache的安装包,解压

memcache-2.2.5.tgz
tar zxf memcache-2.2.5.tgz
ls

2.将之前PHP编译完成的二进制命令加入到环境变量中,可以直接调用PHP命令

vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin

source ~/.bash_profile

php命令现在可以自动补齐

3.创建一个预编译环境并对memcache的源码包进行编译

(1)创建预编译环境

[root@server1 memcache-2.2.5]# pwd
/mnt/memcache-2.2.5
[root@server1 memcache-2.2.5]# phpize


注: phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize

phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件,建立一个configure文件。必须在一个目录下去运行phpize,那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下

(2)编译

[root@server1 memcache-2.2.5]# ./configure

编译完成如下:

(3)安装

[root@server1 memcache-2.2.5]# make && make install

完成之后如下:

4.在php文件中添加memcache模块

[root@server1 ~]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@server1 etc]# vim php.ini

重新加载php-fpm服务

[root@server1 etc]# /etc/init.d/php-fpm start
Starting php-fpm  done
[root@server1 etc]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

5.安装memcache工具,开启memcache服务

yum install -y memcached

[root@server1 ~]# /etc/init.d/memcached start
Starting memcached:                                        [  OK  ]
[root@server1 ~]# netstat -tpnl				##监听端口为11211

6.安装telnet工具,测试

(1)安装telnet工具

yum install -y telnet

telnet localhost 11211
stats

(2)创建westos,查看,没有失效,删除,再次查看失效,退出(quit)

0      0       6
编号 缓存时间   限制的字符数

(3)再次创建为peng 保存时间为10秒,10秒内查看没有失效,10秒后查看失效

[root@server1 ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set name 0 10 4				##设置缓存时间为10秒
peng						##名字
STORED
get name					##10秒内查看
VALUE name 0 4
peng
END
get name 					##10秒后查看
END
quit						##退出
Connection closed by foreign host.

7.将下面的文件复制到/usr/local/lnmp/nginx/html/文件下

[root@server1 memcache-2.2.5]# cp example.php memcache.php /usr/local/lnmp/nginx/html/
[root@server1 memcache-2.2.5]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# ls

(1)修改memcache的密码和访问地址

[root@server1 html]# vim memcache.php

23 define('ADMIN_PASSWORD','peng');        // Admin Password								##密码
28 $MEMCACHE_SERVERS[] = '172.25.6.1:11211'; // add more as an array						##本机IP

重新加载服务

[root@server1 html]# nginx  -s reload

(2)浏览器访问http://172.25.6.1/memcache.php 要输入用户和密码,可以看到现在命中率是50%

(3)再打开一个页面访问http://172.25.6.1/example.php

(4)多次刷新,返回memcache的页面刷新可以看到命中率接近100%


8.安装ab命令,压力测试,模拟5000请求量

[root@server1 html]# yum whatprovides *ab
[root@server1 html]# yum install -y httpd-tools-2.2.15-29.el6_4.x86_64


访问index.php 失败500多次

ab -c 10 -n 5000 http://172.25.6.1/index.php

访问example.php 没有失败而且时间大大减少

[root@server1 html]# ab -c 10 -n 5000 http://172.25.6.1/example.php

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: