本次实验是在LNMP架构——php+nginx+mysql源码编译搭建lnmp环境基础上进行的,lnmp架构已经搭建好,接下来我将给php添加缓存memcache。
文章目录
一、认识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服务器)的资源
客户每访问172.25.12.1/example.php一次172.25.1.1/memcache.php的显示的缓存命中就会增多
客户端压力测试:
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只是一个管理员的页面而已
来源:CSDN
作者:CapejasmineY
链接:https://blog.csdn.net/CapejasmineY/article/details/104355739