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:\memcached\memcached.exe -d install' 安装。
3、再输入: 'c:\memcached\memcached.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