PHP中的Memcache的应用

一、Memcache概述
1、memcache是一个高性能的分布式的内存对象缓存系统,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。
2、Memcache(内存,缓存):是一个高性能的分布式的内存对象缓存系统。通过在内存里维护一个巨大的hash表。(key=value)
  Hash表
key value
mystr “abc”
myarr Array(“aa”, “cc”);
object Object值
3、就是一个软件(服务软件) c/s软件
Mysql       192.168.1.222  3306
Apache      www.baidu.com  80
Memcache    192.168.1.111  11211
维护内存,是将数据在内存中使用, 减少I/O  150k 开源
 

 
二、Memcache工作原理
 
Memcache 软件, memcached
http   httpd
vsftp   vsftpd
c/s软件
memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
客户端使用各种语言去编写 PHP/java/c/c++/perl/python/ruby等
 
 
 
三、安装Memcache服务器(Linux和Window上分别安装)
 
1、Linux下:基于libevent事件
安装libevent时
./configure –with-libevent=/usr
Make && make install
 
安装memcached
./configure –with-libevent=/usr
Make && make install
 
启动:Memcahced –d –m 128 –l 192.168.1.111 –p 11211 –u root    (-m表示分配的,-l表示服务地址,-p表示端口,-u表示启动的用户)
停止: kill `cat /tmp/memcached.pid`;   Killall  memcached
 
2、Windows下
Memcahced.exe  -d  install [uninstall]
Memcached.exe –d  -m 50 –l 127.0.0.1  -p 11211 start
 
a.安装包在上面的文件夹中(需要memcached-1.2.1-win32和php_memcache.dll)
b.解压到目录:c;memcached  (自定义,可在任何目录)
c.c:memcachedmemcached.exe -d install  (安装)
d.c:memcachedmemcached.exe -d start   (启动服务)
e.telnet 127.0.0.1 11211 (使用telnet测试是否成功)  输入stats命令查看基本信息
f.复制php_memcache.dll到 phpext目录下
g.在php.ini中添加:extension=php_memcache.dll,重启服务器,然后在phpinfo()中查看安装情况
 
 
 
四、Memcached服务器的管理(启动)
 
1、Memcached的基本设置:
   -p 监听的端口
   -l 连接的IP地址, 默认是本机
   -d start 启动memcached服务
   -d restart 重起memcached服务
   -d stop|shutdown 关闭正在运行的memcached服务
   -d install 安装memcached服务
   -d uninstall 卸载memcached服务
   -u 以的身份运行 (仅在以root运行的时候有效)
   -m 最大内存使用,单位MB。默认64MB ,最大好像2G-M 内存耗尽时返回错误,而不是删除项
   -c 最大同时连接数,默认是1024
   -f 块大小增长因子,默认是1.25
   -n 最小分配空间,key+value+flags默认是48
   -h 显示帮助
 
   Memcahced.exe  -d  install [uninstall]
   Memcached.exe –d  -m 50 –l 127.0.0.1  -p 11211 start
 
 
2、操作Memcached (命令行方式telnet作为客户端)
     telnet 192.168.1.128  80     ---apache
     telnet 192.168.1.129  21     ---ftpd
     telnet 192.168.1.111  22     ---ssh
     telnet 192.168.1.222  11211  ---memcached
 
3、Memcache各种命令说明
Command Description Example
get Reads a value get mykey
set Set a key unconditionally set mykey 0 60 5
add Add a new key add newkey 0 60 5
replace Overwrite existing key replace key 0 60 5
append Append data to existing key append key 0 60 15
prepend Prepend data to existing key prepend key 0 60 15
incr Increments numerical key value by given number incr mykey 2
decr Decrements numerical key value by given number decr mykey 5
delete Deletes an existing key delete mykey
flush_all Invalidate specific items immediately flush_all
Invalidate all items in n seconds flush_all 900
stats Prints general statistics Stats
Prints memory statistics stats slabs
Prints memory statistics stats malloc
Print higher level allocation statistics stats items
  stats detail
  stats sizes
Resets statistics stats reset
version Prints server version. version
verbosity Increases log level verbosity
quit Terminate telnet session quit
 
4、stats命令说明
pid memcache服务器的进程ID
uptime 服务器已经运行的秒数
time 服务器当前的unix时间戳
version memcache版本
pointer_size 当前操作系统的指针大小(32位系统一般是32bit)
rusage_user 进程的累计用户时间
rusage_system 进程的累计系统时间
curr_items 服务器当前存储的items数量
total_items 从服务器启动以后存储的items总数量
bytes 当前服务器存储items占用的字节数
curr_connections 当前打开着的连接数
total_connections 从服务器启动以后曾经打开过的连接数
connection_structures 服务器分配的连接构造数
cmd_get get命令(获取)总请求次数
cmd_set set命令(保存)总请求次数
get_hits 总命中次数
get_misses 总未命中次数
evictions 为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read 总读取字节数(请求字节数)
bytes_written 总发送字节数(结果字节数)
limit_maxbytes 分配给memcache的内存大小(字节)
threads 当前线程数
 
 
 
五、在PHP程序中使用Memcached
 
1、在PHP安装Memcache扩展
       可以按面向过程方式
       面向对象的方式
 
2、在PHP什么地方使用memcache
    a、数据库读出来的数据(select)使用memcache处理
    b、在会话控制session中使用
 
3、memcached的使用
     a、使用方法
        $memcache = new memcache;
        $memcache->connect("127.0.0.1",11211) or die("连接失败");  //第一个参数是地址,第二个是端口号
        $memcache->set("key","value","zip","time");//set方法添加一个缓存值(键名,键值,是否压缩,保持时间),前面两个参数必须
        $var = $memcache->get("key");  //get通过键名,获取缓存中的内容
     b、Memcache一下常用到的方法
        Memcache::add — 添加一个值,如果已经存在,则返回false
        Memcache::addServer — 添加一个可供使用的服务器地址
        Memcache::close — 关闭一个Memcache对象
        Memcache::connect — 创建一个Memcache对象
        memcache_debug — 控制调试功能
        Memcache::decrement — 对保存的某个key中的值进行减法操作
        Memcache::delete — 删除一个key值
        Memcache::flush — 清除所有缓存的数据
        Memcache::get — 获取一个key值
        Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计
        Memcache::getServerStatus — 获取运行服务器的参数
        Memcache::getStats — 返回服务器的一些运行统计信息
        Memcache::getVersion — 返回运行的Memcache的版本信息
        Memcache::increment — 对保存的某个key中的值进行加法操作
        Memcache::pconnect — 创建一个Memcache的持久连接对象
        Memcache::replace — R对一个已有的key进行覆写操作
        Memcache::set — 添加一个值,如果已经存在,则覆写
        Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩
        Memcache::setServerParams — 在运行时修改服务器的参数
 
六、Memcache的安全(不让别人访问)
 
   内网设置放火墙
   Iptables –A INPUT –p tcp –s 192.168.1.111 –dport 11211 –j ACCEPT
   Iptables –A INPUT –p udp –s 192.168.1.111 –dpost 11211 –j ACCEPT
 
 
 
七、在PHP中的Memcache应用
 
1、最基本的在内存中设置值,增加、重置、删除、Memcache的方法、各种不同数据存储:str,arr,obj
<?php
	$mem=new Memcache;
	$mem->connect("localhost", 11211);
//	$mem->addServer("www.lamp.com", 11221);
//	$mem->addServer("192.167.1.112", 11211);
	$mem->add("mystr", "this is a memcache test!", MEMCACHE_COMPRESSED, 3600);
	$mem->set("mystr", "wwwwwwwwwwwwww", MEMCACHE_COMPRESSED, 3600);
	$mem->delete("mystr"); //删除值
	$mem->flush(); //删除所有的值
	$str=$mem->get("mystr");
	echo "string: ".$str."<br>";
//	$mem->add("myarr", array("aaa", "bbb", "ccc", "ddd")); //默认存30天,也不能超过30天
	print_r($mem->get("myarr"));
	echo '<br>';
	class Person {
		var $name="zhangsan";
		var $age=10;
	}
//	$mem->add("myobj", new Person);
	var_dump($mem->get("myobj"));
	echo "<br>";
	echo $mem->getVersion();
	echo '<pre>';
	print_r($mem->getStats());
	echo '</pre>';
	$mem->close();
?>
 
 
2、从数据库取出的数据放到Memcache中
<?php
	$mem=new Memcache;
	$mem->connect("localhost", 11211);
	//注意:同一个项目安装两次,key要有前缀
	$sql="select * from shops";
	$key=substr(md5($sql), 10, 8);
	$data=$mem->get($key);
	if(!$data){
		$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb");
		$result=$mysqli->query($sql);
		$data=array();
		while($row=$result->Fetch_assoc()){
			$data[]=$row;
		}
		$result->free();
		$mysqli->close();
		$mem->set($key, $data, MEMCACHE_COMPRESSED, 3600);
		echo $sql;
	}
	echo '<pre>';
	print_r($data);
	echo '</pre>';
	$mem->close();
?>
posted @ 2012-04-29 21:36  gxldan  阅读(145)  评论(0编辑  收藏  举报