LNMP架构(4)——php+memcache(缓存内存对象缓存系统)

  • Post author:
  • Post category:php




一、认识memcache



1、弄清静态缓存和动态缓存

  • 静态缓存:生成静态页面——缓存的是整个页面;
  • 动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不需要再读取数据库了,直接通过缓存文件来调取相应数据”;是在新内容发布以后,并不预先生成相应的静态页面,直到对相应内容发出请求时,如果前台缓存服务器找不到相应缓存,就向后台内容管理服务器发出请求,后台系统会生成相应内容的静态页面,用户第一次访问页面时可能会慢一点,但是以后就是直接访问缓存了。



2、什么是MemCache

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。



3、MemCache的工作流程

在这里插入图片描述

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

MemCached采用了C/S架构,在Server端启动后,以守护程序的方式,监听客户端的请求。启动时可以指定监听的IP(服务器的内网ip/外网ip)、端口号(所以做分布式测试时,一台服务器上可以启动多个不同端口号的MemCached进程)、使用的内存大小等关键参数。一旦启动,服务就会一直处于可用状态。

为了提高性能,MemCached缓存的数据全部存储在MemCached管理的内存中,所以重启服务器之后缓存数据会清空,不支持持久化。



4、MemCache访问模型

在这里插入图片描述

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

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

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

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

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

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


注意:MemCache虽然被称为”分布式缓存”,但是MemCache本身完全不具备分布式的功能。MemCache集群之间不会相互通信。所谓的”分布式”,完全依赖于客户端程序的实现,就像上面这张图的流程一样。

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



5、Memcache特性和限制

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。

Memcached单进程最大使用内存为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没有利用完,那么也不会存放别的数据。



6、memcache适用场景

  • 访问频繁的数据库数据(身份token、首页动态)
  • 访问频繁的查询条件和结果
  • 作为Session的存储方式(提升Session存取性能)
  • 页面缓存
  • 更新频繁的非重要数据(访客量、点击次数)
  • 大量的hot数据



二、给php页面添加静态缓存memcache



1、实验思想

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

从初级php开始,再到nginx,再到后端服务器,一级一级加上缓存,客户访问的速率会越来越快
现在我们先给php加上缓存,使用memcache这个工具缓存(类似于加在前端的varnish,用来把数据缓存在内存里面,一旦重启数据都没有了)
数据是缓存在内存里面的,用户请求的时候直接读取缓存



2、实验环境

主机名 ip 服务
server1 172.25.1.101 lnmp架构
真机 172.25.1.250 测试,客户端



3、实验



在server1上:


步骤一:在网上下载memcache安装包,并解压

tar zxf memcache-2.2.5.tgz 


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

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

source ~/.bash_profile

在这里插入图片描述


步骤三:创建编译环境

memcache目录中本来没有configure文件,所以没法编译,执行phpize,生成configure文件后就可以编译了。

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

cd memcache-2.2.5
phpize

在这里插入图片描述


步骤四:编译安装

./configure 
make && make install

在这里插入图片描述

在这里插入图片描述


步骤五:更改php主配置文件,增加memcache模块

vim /usr/local/lnmp/php/etc/php.ini
 874 extension=memcache.so  #手动添加
/etc/init.d/php-fpm reload    

在这里插入图片描述

在这里插入图片描述


步骤六:查看php中是否加入memcache模块

php -m | grep memcache

在这里插入图片描述


步骤七:安装memcache工具,开启memcache服务

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

在这里插入图片描述


步骤八:查看memcache配置文件,开启服务

vim /etc/sysconfig/memcached
#如果在配置文件最后一行加入:-l 127.0.0.1则表示监听本机11211端口,不加对所有
/etc/init.d/memcached start   #开启memcache
netstat -antuple  #可以看到11211端口开启

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


步骤九:telnet测试

    没有则安装 yum install telnet -y

telnet localhost 11211  #使用这个检测本地的端口,存数据
stats  #查看状态
set name 0(表示顺序:键值) 0(表示缓存时间) 6(表示缓存的字符个数)
redhat
get name   #查看value值
delete name  #删除键值
get name  #再次查看键值,查看不到
set name 0 10 6   #定义键值,缓存时间设置为10s
redhat
get name  #10s内可以查看到
get name   #10s后查看不到

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


步骤十:拷贝memcache.php和example.php页面到nginx默认发布目录下,并做修改

example.php 文件不做修改,是客户端访问时查询缓存的策略文件

cp memcache.php example.php /usr/local/lnmp/nginx/html/
cd /usr/local/lnmp/nginx/html/
vim memcache.php 
 22 define('ADMIN_USERNAME','memcache');    // Admin Username(自定义)
 23 define('ADMIN_PASSWORD','redhat');      // Admin Password(自定义)

 28 $MEMCACHE_SERVERS[] = '172.25.1.101:11211'; // add more as an array
##只留一个主机(因为本实验只有一个主机,其实可以添加多个),memcache没有转发或负载均衡机制,只能一个一个添加

在这里插入图片描述

在这里插入图片描述



在真机(客户端)上:

浏览器搜索http://172.25.1.1/memcache.php,可以查看memcache命中率

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

再打开一个页面访问http://172.25.2.1/example.php,这个就相当于客户访问nginx(web服务器)的资源

在这里插入图片描述

在这里插入图片描述

客户端压力测试:

ab -c 10 -n 5000 http://172.25.1.1/index.php #10个并发,5000个请求
#很慢,因为没有缓存,去后端加载数据。而且failed比较多        

在这里插入图片描述

ab -c 10 -n 5000 http://172.25.1.101/example.php #10个并发,5000个请求

#很快,因为访问缓存,而且没有failed

在这里插入图片描述



总结

  • 客户访问的时候先去问nginx代理服务器
  • 如果请求的是静态资源,nginx会直接将静态缓存的资源返回给客户
  • 如果请求的是动态资源,nginx会通过php去找fsatcgi去加载数据库,再把资源给客户端

客户通过php访问后端资源慢,客户通过php的memcache缓存直接访问缓存在内存中的数据很快。

类似于在php服务上面加了memcache服务,就可以缓存数据,使的数据的访问更快(也可以说是备份)


memcache.php只是一个管理员的页面而已



版权声明:本文为weixin_45784367原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。