当前位置: 代码迷 >> 综合 >> lnmp架构(四)——静态缓存之给php添加memcache(nginx+php+mysql+memcache)
  详细解决方案

lnmp架构(四)——静态缓存之给php添加memcache(nginx+php+mysql+memcache)

热度:94   发布时间:2023-12-09 02:26:31.0

文章目录

  • 一、什么是MemCache
  • 二、MemCache的工作流程
  • 三、Memcache特性和限制
  • 四、给php添加memcache

一、什么是MemCache

memcache是一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 ,这是一套开放源代码软件,以BSD license授权发布。

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

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中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

二、MemCache的工作流程

  1. 客户端把请求先发送给代理服务器(一般是nginx)
  2. 先检查客户端的请求数据是否在memcached(MemCached是MemCache服务器端可以执行文件的名称)中,如有,直接把请求数据返回,不再对数据库进行任何操作
  3. 如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)
  4. 每次更新数据库的同时更新memcached中的数据,保证一致性
  5. 当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略失效数据首先被替换,然后再替换掉最近未使用的数据

三、Memcache特性和限制

  • 在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
  • memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快
  • memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛

四、给php添加memcache

实验思想
osi七层模型每一层都可以加上属于自己的缓存,现在我们给lnmp中的php和nginx可以加上缓存,最后将mysql加上缓存,服务器一般不会把数据直接存储在自己上面,存储有专门的地方,交叉存储可以保证正常运行,数据共享,都会存储一份,本地存储+交叉存储当服务器和自己的存储设备都坏了,也可以在其他服务器的存储器上找到自己的数据,可以保证客户正常访问。

实验环境

主机(版本:ip) 功用
虚拟机server1(rhel6.5:172.25.2.1) lnmp环境主机
真机(rhel7.3:172.25.2.250) 测试机

以下配置过程,是在lnmp环境搭建成功的基础上。

1、从真机下载我之前已经下载好的memcache的安装包,并且解压。
在这里插入图片描述

tar zxf memcache-2.2.5.tgz #解压
cd memcache-2.2.5/  #进入解压目录

在这里插入图片描述
2、将之前PHP编译完成的二进制命令加入到环境变量中,可以直接调用PHP命令。

vim ~/.bash_profile 
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
source ~/.bash_profile 

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

3、创建编译环境:
memcache目录中本来没有configure文件,所以没法编译,执行phpize,生成configure文件后就可以编译了。

  • phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize。或者说,phpize的作用可以这样理解:侦测环境(phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件),建立一个configure文件。必须在一个目录下去运行phpize。那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下

在这里插入图片描述

4、编译安装memcachen

./configure
make && make install

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

5、更改php主配置文件,增加memcache模块

vim /usr/local/lnmp/php/etc/php.ini # 将memcache缓存模块与php连接起来
873 extension=memcache.so	 #这个模块以插件的形式运行
/etc/init.d/php-fpm reload #重新加载php

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、php -m | grep memcache可以看到这个模块已经加入到php中,可以看到数据库也与mysql关联

php -m | grep memcache
php -m | grep mysql

在这里插入图片描述

7、安装memcache工具,开启memcache服务,监听端口为11211

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

在这里插入图片描述

在这里插入图片描述

8、编辑配置文件/etc/sysconfig/memcached

在这里插入图片描述

9、启动memcached

/etc/init.d/memcached start
netstat -tlnp

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

10、telnet测试:

telnet localhost 11211
  • 没有的话:yum install -y telnet

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

11、拷贝php页面到nginx默认发布目录/usr/local/lnmp/nginx/html/,并修改memcache.php内容

 [root@server1 memcache-2.2.5]# cp memcache.php example.php /usr/local/lnmp/nginx/html/[root@server1 memcache-2.2.5]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# ls
50x.html  bbs  example.php  index.html  index.php  memcache.php  readme  utility
[root@server1 html]# vim memcache.php define('ADMIN_USERNAME','memcache');    ## Admin Username(自定义)
define('ADMIN_PASSWORD','westos');      ## Admin Password(自定义)$MEMCACHE_SERVERS[] = '172.25.230.5:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array##只留一个主机,memcache没有转发或负载均衡机制,只能一个一个添加(因为本实验只有一个主机,其实可以添加多个)

在这里插入图片描述
12、访问 http://172.25.2.1/memcache.php输入用户名密码,可以查看memcache命中率,
在这里插入图片描述

13、再打开一个页面访问http://172.25.2.1/example.php,这个就相当于客户访问nginx(web服务器)的资源
在这里插入图片描述

客户每访问172.25.2.1/example.php一次,172.25.2.1/memcache.php的缓存就会增多

14、在真机,压力测试,模拟5000请求量

ab -c 10 -n 5000 http://172.25.2.1/index.php 10个并发,5000个请求#很慢,因为没有缓存,而且failed比较多                

在这里插入图片描述

在这里插入图片描述

ab -c 10 -n 5000 http://172.25.2.1/example.php 10个并发,5000个请求#很快,因为访问缓存,而且没有failed的

在这里插入图片描述

1. 其实这两个php文件(index.php、example.php)都相当于放在nginx代理服务器下web资源
2. 客户访问的时候先去问nginx代理服务器
3. 如果请求的是静态资源,nginx会直接将静态缓存的资源返回给客户
4. 如果请求的是动态资源,nginx会通过php去找fsatcgi去加载数据库,再把资源给客户端

客户通过php访问后端资源慢,客户通过php的memcache缓存直接访问缓存在内存中的数据很快
类似于在php服务上面加了memcache服务,就可以缓存数据,使的数据的访问更快(也可以说是备份)memcache.php只是一个管理员的页面而已

  相关解决方案