最近做的一个项目需要不断对数据库内容进行读取和刷新,所以数据库压力很大,用户数目多的时候响应速度也严重受影响。
于是准备将一部分常用数据通过缓存在服务器内存中,减少对数据库的操作来缓解压力(memcached如何减轻数据库压力可见参考1),同时提升响应速度。简单的说:就是假如有十个请求都是需要读取数据库中的同一组数据,那么你通过php脚本实现的读取,需要执行十次读取,如果我在第一次读取并响应的时候将这部分数据以“key-value”的形式缓存在内存中,当还有同样的请求到来直接反馈这部分内存数据,是不是既减轻了数据库压力又提升了速度。
显然,php这种脚本语言是不常驻内存无法做到这个功能的,这个时候memcached服务就派上用场了,可是折腾了小半天,入了不少坑总算搞定分享给大家。
注:本文的经验了过程基于windows server下的php来说明,linux的还请注意。
首先特别容易混淆的:
1.memcached是用来缓存数据的一种服务,将一些常用的数据通过“key-value”的形式存储在数据库内存中。避免了每次访问都需要读取数据库带来的巨大压力。
2.memcache(注意少了一个d)是php可以利用的一个拓展(dll),我们利用这个拓展,就可以在PHP中对memcached中缓存的数据进行操作。
简单来说这两者虽然一个字母d之差(d是 daemon:守护进程,就是说它是跑起来在内存中缓存数据的程序主体),却好比MySQL和PHPmyadmin之间的关系。 根据我的理解,你的数据缓存不一定是在当前web的server上,你可以通过ip+port(当然本机就localhost)的形式连接你在本机或者另外一台电脑上的memcached service来存取数据。这也应该是memcached所谓的分布式的意思,就好比你的PHPmyadmin和MySQL可以在不同的机器上。
所以,正确的姿势是,首先安装memcached,然后作为一个service启动常驻内存,这样它就可以缓存数据了,通过命令行也可以进行操作。
请在你的services中查看是否有了memcached这个服务
但是,因为我准备在php中操作就需要下载memcache的dll放在php的extension中并且在ini配置文件中说明,然后通过phpinfo()函数测试该模块是否加载成功。
如果模块加载不成功请检查以下3个问题:
1.是否在你的php.ini中添加了extension=php_memcache.dll。
2.是否将下载的php_memcache.dll放在你的php的ext文件夹中。
3.是否下载了对应你的php版本的正确的dll,包括NS和NTS的分别。(要知道自己的php版本信息,一样利用phpinfo可以查看)
当module加载成功,你就可以利用下载memcache时候获得的example.php进行测试了。
<?php $memcache = memcache_connect('localhost', 11211); if ($memcache) { $memcache->set("str_key", "String to store in memcached"); $memcache->set("num_key", 123); $object = new StdClass; $object->attribute = 'test'; $memcache->set("obj_key", $object); $array = Array('assoc'=>123, 345, 567); $memcache->set("arr_key", $array); var_dump($memcache->get('str_key')); var_dump($memcache->get('num_key')); var_dump($memcache->get('obj_key')); } else { echo "Connection to memcached failed"; } ?>
在浏览器中测试,便会获得:
string(28) "String to store in memcached" int(123) object(stdClass)#3 (1) { ["attribute"]=> string(4) "test" }
大工告成,把你的服务优化一下,看看速度是不是天壤之别!
关于memcache.dll中提供的方法和使用说明,可以参考http://kimi.it/259.html
对memcached还有兴趣,希望了解其工作原理细节部分的童鞋请移步参考3.
参考
2.http://www.runoob.com/memcached/php-connect-memcached.html