Memcache学习笔记

系统 1654 0

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

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

 

Memcache学习笔记


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论