目录索引:1.概念
2.安装并使用memcached
3.对memcached进行curd操作
4.用memcache扩展操作Memcached
5.memcached机制深入理解
6.memcache的细节
1.概念
Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。相关网站: http://danga.com/ http://memcached.org
2.安装并使用memcached
(1).下载memcached软件
(2).运行cmd命令,切换到memcached.exe目录,运行memecache.exe -d install
(3).启动memcached
第一种方法:到【控制面板/服务】里启动
第二种方法:cmd到memcached目录,运行memcached.exe -d start
(4)用netstat -an查看11211端口是否在监听,如果在监听,说明启动成功。
(补充:1.用netstat -anb可以看11211端口是哪个程序在监听,同时可以看到那些用户连接到我们的服务器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet连接到memcached服务
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷贝一个telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本语法:add key名 0 (存放时间)数据大小
例:add key1 0 30 5
hello
(2)获取
基本语法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放时间 数据大小
方式2:replace key名 0 存放时间 数据大小
例:set key100 0 70 6
ssssss
(4)删除
基本语法:delete key名
例:delete key300
(补充:1.查看状态stats 命中率cmd_set/cmd_get 2.清空内存数据flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache扩展操作Memcached
(1)安装配置
①拷贝一个php_memcache.dll至php的ext目录
②在php.ini开启php_memcache.dll扩展
③重启apache
(2)操作
代码:
1 // 连接memcache服务器 2 $mem = new Memcache(); 3 if (! $mem ->connect('localhost',11211 )) { 4 die ('connect error!' ); 5 } 6 // 增加 7 if ( $mem ->set('key1','val1',MEMCACHE_COMPRESSED,60 )) { 8 echo 'add ok!' ; 9 } 10 $arr = array ('moushu','yunshu' ); 11 if ( $mem ->set('arr', $arr ,MEMCACHE_COMPRESSED,60 )) { 12 echo 'add ok!' ; 13 } 14 class Dog { 15 public $name ; 16 public $age ; 17 } 18 $dog = new Dog(); 19 if ( $mem ->set('dog', $dog ,MEMCACHE_COMPRESSED,60 )) { 20 echo 'add ok!' ; 21 } 22 $null_val = null ; 23 if ( $mem ->set('null_val', $null_val ,MEMCACHE_COMPRESSED,60 )) { 24 echo 'add ok!' ; 25 } 26 $bool_val = null ; 27 if ( $mem ->set('bool_val', false ,MEMCACHE_COMPRESSED,60 )) { 28 echo 'add ok!' ; 29 } 30 $handle = fopen ('2.php','a' ); 31 if ( $mem ->set('res', $handle ,MEMCACHE_COMPRESSED,60 )) { 32 echo 'add res ok!' ; 33 } 34 if ( $mem ->set('name','luoyunshu',MEMCACHE_COMPRESSED,30*3600*24 )) { 35 echo 'add name ok!' ; 36 } // 存储30天 37 if ( $mem ->set('name2','moushu',MEMCACHE_COMPRESSED, time ()+31*3600*24 )) { 38 echo 'add name2 ok!' ; 39 } // 存储31天 40 41 //修改 42 if ( $mem ->replace('key1','hello',MEMCACHE_COMPRESSED,60 )) { 43 echo 'add ok!' ; 44 } 45 46 // 删除 47 if ( $mem ->delete('key1' )) { 48 echo 'del ok!' ; 49 } 50 51 // 查询 52 $val = $mem ->get('key1' ); 53 echo $val ; 54 $val = $mem ->get('arr' ); 55 var_dump ( $val ); 56 $dog = $mem ->get('dog'); // 取对象时要先声明类定义 57 var_dump ( $dog ); 58 $null_val = $mem ->get('null_val' ); 59 var_dump ( $null_val ); // null 60 $bool_val = $mem ->get('bool_val' ); 61 var_dump ( $bool_val ); // '' 62 $res = $mem ->get('res' ); 63 var_dump ( $res ); // 0 64 $res = $mem ->get('key1' ); 65 var_dump ( $res ); 66 $name = $mem ->get('name' ); 67 var_dump ( $name ); 68 $name2 = $mem ->get('name2' ); 69 var_dump ( $name2 ); // moushu
5.memcached机制深入理解
(1)基于c/s架构 ,协议简单
● c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器。
● memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据
(2)基于libevent的事件处理
● libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统: Windows/Linux/BSD/Solaris 等操作系统的的事件处理。
● Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。
(3)内置内存存储方式
● 为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
(4)基于客户端的分布式
● memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。
代码:
1 // 连接memcache服务器,启动两个服务器 (memcached.exe -p 9999 2 $mem = new Memcache(); 3 if (! $mem ->addServer('localhost',11211 )) { 4 die ('connect server1 error!' ); 5 } // serv1 6 if (! $mem ->addServer('localhost',9999 )) { 7 die ('connect server2 error!' ); 8 } // serv2 9 10 //将数据放入哪个memcache服务器,由客户端的mem对象决定 11 //当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后采取决定连接哪个mem服务,因此当你大量加入服务器到连接池时并没有多余的开销。 12 if ( $mem ->set('key1','val1',MEMCACHE_COMPRESSED,120 )) { 13 echo 'add key1 ok!' ; 14 } // 放在serv1 15 if ( $mem ->set('key2','val2',MEMCACHE_COMPRESSED,120 )) { 16 echo 'add key2 ok!' ; 17 } // 放在serv2 18 if ( $mem ->set('key3','val3',MEMCACHE_COMPRESSED,120 )) { 19 echo 'add key3 ok!' ; 20 } // 放在serv1 21 22 $res1 = $mem ->get('key1' ); 23 $res2 = $mem ->get('key2' ); 24 $res3 = $mem ->get('key3' ); 25 echo $res1 ; 26 echo $res2 ; 27 echo $res3 ;
6.memcache的细节
(1)生命周期
从数据放入memcache开始计时,直到时间到了,就销毁,如果时间为0,则表示不过期。memcache的数据被销毁情况有:1.时间到了 ②重启memcached服务 ③delete掉了
(2)将 session数据 放入 memcached 中
①.配置:
第一种方法:修改php.ini 文件,修改如下:
save-handler=memcache
session.save_path = "tcp://localhost:11211"
第二种方法,使用ini_set()
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://localhost:11211');
一些说明: memcached 主要的目的是提速,数据不和用户绑定(session数据存入memcache中以session id作为键值,任何可访问memcache的人都可以取到值)。 session 数据和用户绑定,更安全。
(3) memcached 安全性
通过启用防火墙来防止外网访问 memcached 服务,保证 memcached 的安全。 linux系统设置防火墙的命令:iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT
(4)样的数据适合放入 memcache 中?
变化频繁,具有不稳定的数据,不需要实时入库(比如用户在线状态、在线人数 .... ),想加快用户访问应用的速度。大数据,如图片、视频不适合放入memcache中。
到这,时间再完善.....