Memcache学习笔记

目录索引: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中。

  到这,时间再完善.....

 

posted @ 2013-12-07 23:07  雲舒  阅读(335)  评论(0编辑  收藏  举报