Memcache(分布式缓存)是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
原理:
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;
如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);
每次更新数据库的同时更新memcached中的数据,保证一致性;
当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
tar zxf memcache-2.2.5.tgz 解压
cd memcache-2.2.5
phpize 侦测环境,根据对应的环境,配置生成对应的编译文件
./configure 编译
make && make install 安装
memcache目录中本来没有configure文件,所以没法编译。phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
cd modules/
vim /usr/local/lnmp/php/etc/php.ini
873 extension=memcache.so 增加缓存模块(这个模块以插件的形式运行)
/etc/init.d/php-fpm reload 重新加载
yum install -y memcached 安装服务端的主程序
rpm -qa | grep memcache 查看安装包版本
rpm -ql memcached.x86_64 查看生成文件
vim /etc/sysconfig/memcached 环境配置
OPTIONS="" ("-l 127.0.0.1"-->加入,11211端口就只对本机)
/etc/init.d/memcached restart
netstat -tnlp
yum install -y telnet 使用telnet工具检测11211端口使用开启是否正常,有时候启动memcached不会报错
telnet localhost 11211 测试一下
stats
set name 0 0 6 (westos) 0(序号:表示键值) 0(表示缓存时间) 6(表示缓存的字符个数)
get name
delete name
set name 0 5 6
quit 退出
cd memcache-2.2.5
cp example.php memcache.php /usr/local/lnmp/nginx/html 图表页面和测试页面放到Nginx的默认发布目录下
cd /usr/local/lnmp/nginx/html
vim memcache.php 编辑图表页面
define('ADMIN_PASSWORD','redhat'); // Admin Password 密码
$MEMCACHE_SERVERS[] = '172.25.38.1:11211'; // add more as an array 主机号端口
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array 注释掉
/etc/init.d/memcached restart
netstat -tnlp
浏览器:
http://172.25.38.1/memcache.php 图表查看缓存页面 用户:memcache 密码:redhat
http://172.25.38.1/example.php 测试页面(不断刷新,图表页面会变)
真机测试:
yum whatprovides *ab
yum install -y httpd-tools-2.2.15-29.el6_4.x86_64 ab测试工具
ab -c 10 -n 5000 http://172.25.38.1/index.php 耗时久且有失败
ab -c 10 -n 5000 http://172.25.38.1/example.php 耗时少且全部成功
客户访问的时候先去问nginx代理服务器
如果请求的是静态资源,nginx会直接将静态缓存的资源返回给客户
如果请求的是动态资源,nginx会通过php去找fsatcgi去加载数据库,再把资源给客户端