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

1 Memcache介绍

Memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度
尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 ,这是一套开放源代码软件,以BSD license授权发布
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度

MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储
数据可以来自数据库调用、API调用,或者页面渲染的结果
MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题
而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言

Memcache是一款开源的、高性能的纯内存缓存服务软件,Memcache项目诞生于2003年。Mem就是内存的意思,cache是缓存的意思,d是daemon的意思。Memcache服务分为服务端和客户端两部分,C/S模式。
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度

> 说明:MemCache虽然被称为"分布式缓存",但是MemCache本身完全不具备分布式的功能 MemCache集群之间不会相互通信
> (与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据)
> 所谓的"分布式",完全依赖于客户端程序的实现

1.1 MemCache一次写缓存的流程

1)应用程序输入需要写缓存的数据
2)API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
3)由服务器编号得到MemCache及其的ip地址和端口号
4)API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中
这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

1.2 介绍一下MemCache和MemCached的区别

服务端软件:memcached(连接php)
客户端软件:memcache(主程序)

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

1.3 Memcache作用?

在启动Memcached时,会指定一个内存大小参数,然后会被分配一个内存空间。
当我们读取数据库后的业务数据,放入Memcached缓存中,下一次请求同样数据的用户,直接去Memcachd取数据返回给用户。

这样做的好处?

(1)对于用户来说,用户访问网站更快了,体验更好了。 
 (2)数据库压力降低了,内存没有的时候,就会请求数据库。
  (3)提升网站并发访问,服务器数量变少。

1.4 MemCache的工作流程

客户端把请求先发送给代理服务器(一般是nginx)
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作
如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端
同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)
每次更新数据库的同时更新memcached中的数据,保证一致性 当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略 失效数据首先被替换,然后再替换掉最近未使用的数据
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表
它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等
简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度 Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用
Memcached是以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作

1.5 Memcache特性和限制

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存
要使用更多内存,可以分多个端口开启多个Memcached进程
最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA,606024*30控制
最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制
单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,它是默认的slab大小
最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过settings.maxconns=1024 进行控制 跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式
memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快
memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛
memcached作为小规模的数据分布式平台是十分有效果的 memcached是键值一一对应,key默认最大不能超过128个字
节,value默认大小是1M,也就是一个slabs
如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小
多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据
可支持C/C++、Perl、PHP、Python、Ruby、Java、C#、Postgres、Chicken
Scheme、Lua、MySQL和Protocol等语言客户端

1.6 实验思想

osi七层模型每一层都会加上属于自己的缓存
现在我们给lnmp中的php和nginx可以加上缓存,最后将mysql加上缓存
服务器一般不会把数据直接存储在自己上面,存储有专门的地方
交叉存储可以保证正常运行,数据共享,都会存储一份,本地存储+交叉存储
当服务器和自己的存储设备都坏了,也可以在其他服务器的存储器上找到自己的数据,可以保证客户正常访问
如何给php加缓存
从初级php开始,再到nginx,再到后端服务器,一级一级加上缓存,客户访问的速率会越来越快
现在我们先给php加上缓存,使用memcache这个工具缓存,相当于mysql
(类似于加在前端的varnish,用来把数据缓存在内存里面,一旦重启数据都没有了)
数据是缓存在内存里面的,用户请求的时候直接读取缓存

2.互联网常见缓存软件

Memcached 纯内存 用来缓存后端数据库的数据(用户信息,帖子,博文等)
Memcachedb 内存+磁盘 新浪开发,Memcacehd+BDB 缓存后端数据库数据,直接做数据库用
Redis 内存+磁盘 作用同Memcachedb 主从复制,数据类型更丰富。
squid 内存+磁盘
varinish 内存
缓存静态图片,JS,CSS,HTML,视频等。CDN就是利用这类软件做的分布式缓存。

3 搭建memcache

以下配置过程中使用到的相关资源是建立在PHP源码编译成功的基础上
(1)解压

ls查看memcache的包(一个缓存数据的工具)
tar zxf memcache-2.2.5.tgz 解压
cd memcache-2.2.5/进入解压目录

在这里插入图片描述
(2)使用phpize生成配置文件
首先因为安装php时已经生成了phpize,所以不用再次安装
在这里插入图片描述

在这里插入图片描述
解决问题
在这里插入图片描述
再次尝试:
在这里插入图片描述
注:不是所有的tar.gz的包解压之后没有confiure包都可以用phpize生成,这是因为这个是php的插件,所以可以用phpize生成。
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize
phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境
所以是要根据该php的配置情况生成对应的configure文件,建立一个configure文件
必须在一个目录下去运行phpize,那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下

(3)预编译:
在这里插入图片描述
(4)安装:
在这里插入图片描述
在这里插入图片描述
(5)php文件中添加openssl模块和memcache模块
在这里插入图片描述

在这里插入图片描述

[root@server1 openssl]# pwd
/root/php-7.4.1/ext/openssl

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)将memcache缓存模块与php连接起来


vim /usr/local/lnmp/php/etc/php.ini 将memcache缓存模块与php连接起来
加入 搜索extension 在900多行
加入: extension=memcache.so(这个模块以插件的形式运行)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
(7)重新加载php-fpm服务

/etc/init.d/php-fpm reload重启php服务
php -m | grep memcache可以看到这个模块已经加入到php中
php -m | grep mysql可以看到数据库也与mysql关联

在这里插入图片描述
插件配置完成。
(8)配置服务端:

安装memcache工具,开启memcache服务,监听端口为11211
yum install -y memcached安装这个服务,提供接口11211客户才能用(之前只是一个模块)
rpm -qa | grep memcache查看版本
rpm -ql memcached-1.4.4-3.el6.x86_64查看生成的各种文件

在这里插入图片描述
在这里插入图片描述

vim /etc/sysconfig/memcached 编辑配置文件
加入:-l 172.0.0.1
/etc/init.d/memcached start启动memcache服务
netstat -tnlp查看可以看到11211端口开启,只对本机
 vim /etc/sysconfig/memcached 什么都不加,对所有都开启
 /etc/init.d/memcached restart重启
 netstat -tnlp

在这里插入图片描述
(9)测试memcached是否生效
安装测试工具:
在这里插入图片描述
安装telnet工具,测试

 yum install -y telnet安装这个命令
 telnet localhost 11211使用这个检测本地的端口,存数据
stats
set name 0(表示顺序:键值) 0(表示缓存时间) 6(表示缓存的字符个数)
westosaa错误
westos错误,时间已经过去
set name 0 0 6
westos正确
get name有
delete name
get name没有
set name 0 5 6再次创建为westos保存时间为5秒,5秒内查看没有失效,5秒后查看失效
等待5s
get name 没有
quit

在这里插入图片描述
在这里插入图片描述

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

(10) 将下面的文件复制到/usr/local/lnmp/nginx/html/默认发布目录下

在这里插入图片描述

修改memcache的密码和访问地址
vim memcache.php
加入管理员密码:password,名字memcache(我没有更改)
192.168.0.11
注释掉一个memcache
重新加载服务

在这里插入图片描述
在这里插入图片描述
测试:
(11)浏览器访问http://192.168.0.11/memcache.php 要输入用户和密码,可以看到现在命中率50%
通过nginx代理服务可以在浏览器输入192.168.0.11/memcache.php看到缓存页面,需要管理员登录
在这里插入图片描述
(12)再打开一个页面访问http://192.25.254.11/example.php
在浏览器输入192.25.254.11/example.php这个就相当于客户访问nginx(web服务器)的资源
在这里插入图片描述
多次刷新,返回memcache的页面刷新可以看到命中率接近100%
访问次数越多从缓存中读取的数据越大:

在浏览器页面看效果:
客户每访问172.25.12.1/example.php一次
172.25.12.1/memcache.php的缓存就会增多

在这里插入图片描述

(13)安装ab命令,压力测试,模拟5000请求量
测试是否加速了访问:

[root@foundation Downloads]# yum whatprovides ab
[root@foundation Downloads]# yum install httpd-tools-2.4.6-88.el7.x86_64

(14)测试没有经过memcache的页面

访问index.php慢而且失败400多次
ab -c 10 -n 5000 http://192.168.0.11/index.php慢,去后端加载慢

在这里插入图片描述
在这里插入图片描述
(15)测试经过memcache的页面:

访问example.php 没有失败而且时间大大减少
ab -c 10 -n 5000 http://192.168.11/example.php快(即使并发请求几乎没有失败),直接从缓存中拿资源快
这个文件里面说了去加载memcache读取内存中的内容,这里面的内容我们可以自己写

在这里插入图片描述
在这里插入图片描述

其实这两个php文件(index.php、example.php)都相当于放在nginx代理服务器下web资源
客户访问的时候先去问nginx代理服务器 如果请求的是静态资源,nginx会直接将静态缓存的资源返回给客户
如果请求的是动态资源,nginx会通过php去找fsatcgi去加载数据库,再把资源给客户端
客户通过php访问后端资源慢,客户通过php的memcache缓存直接访问缓存在内存中的数据很快
类似于在php服务上面加了memcache服务,就可以缓存数据,使的数据的访问更快(也可以说是备份)
其实memcache.php只是一个管理员的页面而已

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值