一、什么是Memcache
Memcache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用用来减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度
二、Memcache的应用场景
通常情况下,我们会在访问量较高的Web网站和应用中使用Memcache,用来环节数据库的压力,并且提升网站和应用的响应速度
在应用程序中,我们通常在以下节点来使用Memcached:
- 访问频繁的数据库数据(身份token、首页动态)
- 访问频繁的查询条件和结果
- 作为session的存储方式(提高session存取性能)
- 页面缓存
- 更新频繁的非重要数据(访客量、点击次数)
- 大量的hot数据
** 常用的工作流程**:先检查客户端的请求数据是否在memcached中,如果有的话,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcache中,就去查数据库,把从数据库中获取的数据返回个客户端,同时把数据缓存一份到memcached中;每次更新数据库的同时更新memcached中的数据,保证一致性;当分配个memcached内存空间用完之后会使用LRU(least recently used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据
三、Memcache的服务器端和客户端的安装
1、创建一个预编译环境并进行编译汇编memcache源码包
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,比如你想在原来编译好的php中加入memcached模块或是ImageMagick等模块,可以使用phpize
2、如何使用phpize
当php编译完成之后,会在php的bin目录下生成一个phpize这个脚本文件,
现在想在php中加入memcache扩展模块
- 解压memcache源码包(http://memcached.org)
[root@server1 ~]# tar zxf memcache-2.2.5.tgz
- 将前面php编译完成的二进制命令加入到系统的环境变量中,保证可以直接调用php命令
[root@server1 bin]# vim ~/.bash_profile
[root@server1 bin]# source ~/.bash_profile
- 将在php中扩展memcache模块
[root@server1 ~]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# vim php.ini
873 extension=memcache.so
[root@server1 etc]# /etc/init.d/php-fpm reload
Reload service php-fpm done
- 设置memcached密码
[root@server1 ~]# cd memcache-2.2.5
[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]# vim memcache.php
- 安装memcache服务端
[root@server1 html]# yum install -y memcached
[root@server1 html]# /etc/init.d/memcached start
访问example.php
访问memecache.php
登录进去之后:刷新example.php页面,可以在下图中看到hit命中率,刷新的次数越多,命中率越高,当多次访问,命中率可达到百分之百
- **访问测试
ab(apache bench)是apache下的一个工具,主要用于对web站点做压力测试
在主机中测试
[root@foundation66 kiosk]# ab -c 10 -n 1000 http://172.25.66.1/index.php
[root@foundation66 kiosk]# ab -c 10 -n 1000 http://172.25.66.1/example.php
当访问example.php时,命中率大大提高,速度也提高了将近三倍。
注解:ab -c 10 -n 1000 http://172.25.66.1/example.php 测试结果分析
Server Software: nginx/
Server Hostname: 172.25.66.1
Server Port: 80
Document Path: /index.php
Document Length: 123 bytes #请求的页面大小
Concurrency Level: 10 #并发量
Time taken for tests: 0.656 seconds #测试总共耗时
Complete requests: 1000 #完成的请求
Failed requests: 0 #失败的请求
(Connect: 0, Receive: 0, Length: 909, Exceptions: 0)
Write errors: 0 #错误
Total transferred: 280000 bytes #总共传输数据量
HTML transferred: 123000 bytes
Requests per second: 1525.84 [#/sec] (mean) #每秒钟的请求量
Time per request: 6.554 [ms] (mean) #平均请求等待时间(用户等待时间)
Time per request: 0.655 [ms] (mean, across all concurrent requests) #服务器平均请求响应时间,在并发量为1时,用户等待时间相同
Transfer rate: 417.22 [Kbytes/sec] received #平均每秒多少k,即就是带宽速率