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

原文地址:https://www.cnblogs.com/hxjbc/p/4427935.html