一.什么是memcache?
memcache是一套分布式的高速缓存系统,对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著,是一套开放源代码软件。它通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。服务器端主程序memcached是以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作,最大同时连接数为200。memcache既支持TCP协议,也支持UDP协议。
二.memcache的工作流程
memcache先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
三.memcached与redis
redis是一个开源的日志型、Key-Value数据库,与memcache相比,有如下区别:
1.memcached所有数据一直存储在内存中,而redis并不是;
2.memcached只支持简单的key/value类型的数据,redis支持list、set、hash等数据结构的存储;
3.redis支持数据的备份,即主从数据的复制;
4.redis支持数据的持久化,可以讲内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
四.memcached在php中的简单应用
系统环境:rhel6 x32 selinux and iptables disabled
主机角色:172.25.46.1 nginx php memcached
此实验中关于nginx和php的安装不再讲解,可参考我之前的文章《基于lnmp架构的Dsicuz论坛》
获取源码包并进行解压缩
# tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5
配置环境变量
# vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
# source ~/.bash_profil
使用phpzie扩展php模块,即在php中加入memcached模块
# phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
# ./configure --enable-memcache
# make &&make install
Installing shared extensions: /usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20100525/
# cd /usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20100525/
# ll memcache.so
-rwxr-xr-x 1 root root 259040 Jan 16 14:00memcache.so
memcached为php做缓存
# cd /usr/local/lnmp/php/etc
# vim php.ini
844 ; extension=msql.so
845 extension=memcache.so
编写php函数
# cd /usr/local/lnmp/nginx/html
# vim index.php
<?php
phpinfo()
?>
开启nginx及php服务
# nginx
# nginx -s reload
# /etc/init.d/fpmrestart
此时可以使用浏览器测试php页面,我在实验中访问的是172.25.46.1/index.php,如图:
安装并启动memcached服务
# yum install -y memcached.x86_64
# /etc/init.d/memcached start
测试端口
# telnetlocalhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats ##查看memcached状态
STAT pid 4664
STAT uptime 72
STAT time 1452925893
STAT version 1.4.4
......
STAT curr_items 0
STAT total_items 0
STAT evictions 0
END
quit
将memcached监控页面放到nignx的发布目录下
# cd memcache-2.2.5
# cp memcache.php /usr/local/lnmp/nginx/html/
# cd /usr/local/lnmp/nginx/html/
# vim memcache.php
$VERSION='$Id: memcache.php,v 1.22008/09/11 19:21:06 mikl Exp $';
define('ADMIN_USERNAME','memcache'); // Admin Username
define('ADMIN_PASSWORD','westos'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = '172.25.46.1:11211';// add more as an array #监听本机的11211端口
#$MEMCACHE_SERVERS[] ='mymemcache-server2:11211'; // add more as an array
注意:在此实验中,编辑此文件时要将后两行注释掉一行。我在实验开始,都打开后,可以访问到监控页面,但是显示不了监控画面。
编写测试页面
# vim test.php
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211)or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version:".$version."\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object,false, 10) or die ("Failed to save data at the
server");
echo "Store data in the cache (datawill expire in 10 seconds)\n";
$get_result = $memcache->get('key');
echo "Data from the cache:\n";
var_dump($get_result);
?>
此时可以使用浏览器访问memcached监控页面,我在实验中访问的是172.25.46.1/memcache.php,用户及密码是文件memcache.php编辑的,如图:
进入监控页面,可以看到缓存使用为0,命中率为50%:
访问test.php页面,对memcached进行测试,实验中我访问的是172.25.46.1/test.php,如图:
刷新此页面,再观察memcached监控页面发生变化,缓存使用为119.0,命中率为85.7%,如图:
这是一个简单的memcached在php中的应用,如您发现博文中存在问题或者您有更好地建议和意见可及时反馈给我哦~谢谢您的来访!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。