zoukankan      html  css  js  c++  java
  • memcached

    一、Memcached概念:

       memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

    为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

      


    理解:就是相当于一个缓存,将数据库的内容放在内存中,然后在第二次取数据的时候,可以直接从内存中取出。 

    问题:在存入修改数据库的时候,会不会也是通过memcached,然后在到数据库的,还是直接操作数据库? 

    二、安装

    下面只说关于windows的安装:

    (1)服务器端的安装

    1、将第一个包解压放某个盘下面,比如在c:memcached。

    2、在终端(也即cmd命令界面)下输入 'c:memcachedmemcached.exe -d install' 安装。

    3、再输入: 'c:memcachedmemcached.exe -d start' 启动。(需要注意的: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了)。

    (2)客户端的安装

    1.根据自己的php版本下载相应的memcached.dll动态链接库,存放到php安装文件下面的ext扩张文件夹中。

    2. 在php.ini中加入

     
    [Memcache]
    memcache.allow_failover = 1
    memcache.max_failover_attempts=20
    memcache.chunk_size =8192
    memcache.default_port = 11211 

     最好就放在刚才写 "extension=php_memcache.dll" 的下面。

    重新启动Apache,然后查看一下phpinfo,如果有 memcache 的说明,那么就说明安装成功啦!

    三、测试代码

    <?php
    function  select($sql, Memcache $memcache){
        //如果有数据直接利用memcached取出,key为sql语句;一对一的映射
        $key = md5($sql);
        $data = $memcache ->get($key);
        //第一次从数据库中取出数据
        if(!$data)
        {
          try{ //利用pdo快捷取出数据
               $pdo = new PDO("mysql:host=localhost;dbname=phpcms","root","");
             }
          catch(PDOException $e)
          {
            die("连接失败:".$e ->getMessage());
          }
          //$stmt为临时句柄
          $stmt = $pdo -> prepare($sql);
          $stmt ->execute();
          $data = $stmt ->fetchAll();
          //使用memcached中的add方法,添加一对一的映射;将数据存放在内存,对应标记为key;
          //下次取数据就可以用memcached中的get方法直接从内存中取出。
          $memcache ->add($key, $data);
        }
        return $data;
      }
       //memcached的默认端口为11211
      $memcache = new Memcache;
      $memcache->connect('localhost', 11211) or die ("Could not connect");
     //调用上面写好的select函数
      $data = select("select * from v9_site",$memcache);
      echo '<pre>';
      var_dump($data);
      echo '</pre>';
    ?>

    问题来了:运行结果如下:

    取出的数据出现乱码,经测试不是因为pdo引起的,而是memcached引起的,怎么解决?

    原因是memcached 自动压缩

    方法一:加入代码

    $memcache->setCompressThreshold(2000, 0.2);  

    会自动启用压缩策略,当数据大于2k时,以0.2的压缩比进行zlib。 

     方法二:修改add函数

    $memcache -> add($key,$data,false);

    最后一个参数是false,不压缩;

    经测试上面两种方法都可以!

     补充:linux中的memcached的安装

    1、yum -y install memcached

    2、memcached -d -m 10 -u root -l 192.168.5.80 -p 11211 -c 256 -P /tmp/memcached.pid  
    参数说明:
    -d选项是启动一个守护进程
    -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB
    -u是运行Memcache的用户,我这里是root
    -l是监听的服务器IP地址
    -p是设置Memcache监听的端口,最好是1024以上的端口
    -c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
    -P是设置保存Memcache的pid文件

    3、验证安装:memcached -h

                     /etc/rc.d/init.d/memcached status

    4. 查看配置文件

    cat /etc/sysconfig/memcached

    可以根据情况修改相关配置参数:

    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""

     5.启动memcached

    /etc/rc.d/init.d/memcached start

     如果出现PHP Fatal error:  Class 'Memcache' not found in ...........

    可能是由于php与memcached版本不一致的情况.

    详见http://lzw.me/a/php-fatal-error-class-memcache-not-found-in.html

    参考资料 http://blog.csdn.net/wusuopubupt/article/details/9128431

    http://www.cnblogs.com/yorian/archive/2012/03/16/2400279.html

  • 相关阅读:
    (Vedctor经典)A
    C++ map用法
    (约瑟夫应用)5.4.1 Roman Roulette
    部分题集代码
    随机生成数
    如何在AutoCAD中实现鼠标双击事件
    浅谈JS之Error对象
    自定义微信小程序swiper轮播图面板指示点的样式
    物理像素与逻辑像素相关概念
    微信小程序中padding-right和margin-right无效
  • 原文地址:https://www.cnblogs.com/hxjbc/p/4427935.html
Copyright © 2011-2022 走看看