目录索引:1.概念
2.安装并使用memcached
3.对memcached进行curd操作
4.用memcache扩展操作Memcached
5.memcached机制深入理解
6.memcache的细节
1.概念
Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。相关网站:
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命令:)
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); //null60 $bool_val = $mem->get('bool_val'); 61 var_dump($bool_val); //''62 $res = $mem->get('res');63 var_dump($res); //064 $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 } //放在serv115 if($mem->set('key2','val2',MEMCACHE_COMPRESSED,120)) {16 echo 'add key2 ok!';17 } //放在serv218 if($mem->set('key3','val3',MEMCACHE_COMPRESSED,120)) {19 echo 'add key3 ok!';20 } //放在serv121 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中。
到这,时间再完善.....