热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

前言

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相关配置要求
虚拟机server1172.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_profilePATH=$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.php23 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

在这里插入图片描述

在这里插入图片描述


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 浅析对象 VO、DTO、DO、PO 概念
    作者|CatQi链接|cnblogs.comqixuejiap4390086.html前言由于此订阅号换了个皮肤,导致用户接受文章不及时。读者可以打开订阅号「Web项 ... [详细]
author-avatar
晴felleman_110
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有