浅解memcache

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅解memcache相关的知识,希望对你有一定的参考价值。


一.什么是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中的简单应用


  • 获取源码包并进行解压缩

     #  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页面,我在实验中访问的是192.168.100.130/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监控页面,我在实验中访问的是192.168.100.130/memcache.php,用户及密码是文件memcache.php编辑的,如图:

 技术分享


进入监控页面,可以看到缓存使用为0,命中率为50%:

技术分享


访问test.php页面,对memcached进行测试,实验中我访问的是192.168.100.130/test.php,如图:

技术分享


刷新此页面,再观察memcached监控页面发生变化,缓存使用为119.0,命中率为85.7%,如图:

技术分享


这是一个简单的memcached在php中的应用,如您发现博文中存在问题或者您有更好地建议和意见可及时反馈给我哦~谢谢您的来访!

技术分享

本文出自 “真水无香” 博客,请务必保留此出处http://chengyanli.blog.51cto.com/11399167/1789631

以上是关于浅解memcache的主要内容,如果未能解决你的问题,请参考以下文章

redis与memcached有什么区别

Memcached详解

(实用篇)Redis和Memcached有什么区别?

memcached 的多线程是什么?如何使用它们?

memcached 的多线程是什么?如何使用它们?

php memcache 缓存