zoukankan      html  css  js  c++  java
  • memcached 安装以及在php中使用

    最近做的一个项目需要不断对数据库内容进行读取和刷新,所以数据库压力很大,用户数目多的时候响应速度也严重受影响。

    于是准备将一部分常用数据通过缓存在服务器内存中,减少对数据库的操作来缓解压力(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.

    参考

    1.使用PHP连接、操纵Memcached的原理和教程

    2.http://www.runoob.com/memcached/php-connect-memcached.html

    3.memcached的原理解析

  • 相关阅读:
    使用mybatis如果类属性名和数据库中的属性名不一样取值就会为null
    学习mybatis时出现了java.io.IOException: Could not find resource EmployeeMapper.xml
    配置mybatis-config.xml出现过很诡异的现象
    mybatis学习(一)
    报错cannot be cast to javassist.util.proxy.Proxy
    列车调度
    三角形
    土豪聪要请客(stol)
    Jams倒酒(pour)
    Data
  • 原文地址:https://www.cnblogs.com/lesliexong/p/6946271.html
Copyright © 2011-2022 走看看