memcached---------------------------------个人笔记

********************************************************Memcached缓存技术**************************************************************************


1:基本概念

   最早是danga的一个项目,为Live Journal服务的,做成了一个软件。

   介绍;Memcached是一种缓存技术,它可以将你的数据放入内存,从而通过内存访问提速。因为内存的速度是最快的(cpu的寄存器更快,但价格高昂),Mencached的主要目的就是提速。








2:三种方式访问

   1)直接访问数据库(最慢的方案)

   2)使用真静态(磁盘   学生成绩页面,稍快)

   3)访问内存(Memcached服务维护了一张内存表(hahstable)(key;一般是子串,不能重复   value:可以放入字符串,数值,数组,对象,bool,二进制数据【图片视频】),最快)      

      //第一次我访问数据库,将该学员的成绩直接放入Memcached。


      MYSQL里面也有一张内存表,目前技术停留在希望能够将数据全部放入mysql内存表。







3:安装并使用Mencached

   

   软件:memcached-1.2.6-win32-bin.zip


   安装步骤:

   1)下载memcached软件

   2)安装:将exe文件拷到apache并列的一个文件夹下

      进入到cmd,切换到memcached.exe文件所在目录    cd  所在目录

      mencached.exe  -d  install

      3)启动memcached

      第一种,可以到服务点击启动,就是任务管理器,点击启动

      第二种,命令行启动,mencached.exe  -d  start|stop            

              如果你在win7下启动不成功,则可以使用如下shell方式:memcached.exe  -p  端口号【因为它是shell方式,所以不要关闭控制台了】(不一定是11211,0-65535空闲的端口即可,端口号使用2个字节表示。有名端口:0-1024不要去占用)

              apache  80  

              mysql   3306

              ftp     21

              ssh     22

              oracle  1521

              stmp    25等面试可能会被问到。

              使用netstat  -an如果看到11211端口在监听,说明启动成功

              使用netstat  -anb可以看到各个端口是在监听什么程序,还可以看到有哪些用户连接到我们的服务器

              使用netstat  -a可以看到连到服务器的ip与主机

              使用netstat  -a  192.168.1.100可以知道192.168.1.100对应的主机名

              

        如果没有安装好,原因可能使:

        1)如果你是windows7,win7对安全性要求高,所以必须以adminstartor身份安装。

           你切换成adminstartor,去安装,再启动

        2)你的memcached.exe目录有中文,或者特殊字符,保证路径没有中文与特殊字符即可。

    

      4)准备研究如何对memcached进行curd操作(memcached服务)

         php程序操作(memcache扩展操作,memcached扩展操作,直接使用socket编程来操作)用得最多

         telnet工具


         看看telnet如何操作(curd)

         1)登录到telnet连接到memcached服务

           如在cmd控制台里面:telnet  127.0.0.1   11211

         2)增加

           add  key名  0  存放时间(s)  数据大小(字符)

           add key1  0  30   5

           hello

          3)获取

           get   key值

           get   key1  

          4)修改

           set key名   0   存放时间   数据大小                  如果key名不存在,相当于增加一个新的,如果存在,相当于替换。

           replace key名    存放时间   数据大小                 如果key名不存在,则失败,这个指令要求key名必须存在。

          5)删除

           delete  key名

          6)其它指令

           append    append   key100 0  40 2  gg     将两个字符gg添加到key100中(在后面加)

           preend                                                               (在前面加)

           flush_all 可以统一将数据清空

           stats     统计表,大家可以去计算出命中率cmd_hits/cmd_get越高越好!!!!!







4:如何使用php程序操作我们的mencached服务crud?

   步骤,准备工作: 

   1)将php_mencache.dll拷贝到php的ext下(不同版本的php对应着不同版本的.dll文件)

     【为了让php可以操作,danga公司提供了.dll动态链接库php_mencache.dll(VC编译)】

   2)加载配置,修改php.in文件,加载php_mencache.dll(该文件就是封装了一堆函数)

      搜extension,加入;加载php_mencache.dll文件

                       extension=php_mencache.dll

     3)重启apache

     4)我们写程序来完成crud操作

        men1.php

        <?php

              //创建一个men对象实例

              $men=new Mencache();

              

              if(!$men->connect("127.0.0.1".11211)){

                     die("连接失败");

              }

              //增加

              //1增加一个字符串

              $men->add(‘key1‘."beijing".MEMCACHE_COMPRESSED.60)){

                    echo "添加ok";

              }

              //添加数字

              雷同

              //添加数组

              $arr=array("北京"."添加");

              雷同

              

              //4.添加对象

              class Dog{

                 public $name;

                 public $age;

                 public  function __construct($name.$age){

                     $this->name=$name;

                     $this->age=$age;

                 }

              }

              $dog1=new Dog(‘小狗‘.50);

              if($men->set(‘key1‘.$dog1.MENCACHE_COMPRRESSED.60)){

                   echo ‘添加ok ‘:

              }


              //5添加null.bool

              if($men->set(‘key1‘.null.MENCACHE_COMPRRESSED.60)){

                   echo ‘添加null ok ‘:

              }

              if($men->set(‘key1‘.false.MENCACHE_COMPRRESSED.60)){

                   echo ‘添加ok ‘:

              }


              //资源类型进入

              $con=mysql_connect("127.0.0.1"."root"."root");

              if(!$con){

                 die(‘连接数据库失败‘);

              }

              if($men->set(‘key1‘.$con.MENCACHE_COMPRESSED.60)){

                    echo "添加资源Ok";

              }//资源实际上添加失败

              //在添加数组时,根据需要,希望序列化再放入


              serialize($arr)           如果根据需要也可以json_encode($arr)     json_decode反序列化

              //查询

              $val=$men->get(‘key1‘);

              echo ‘<br/>val=‘.$val;                

          //修改

          $men->replace("key1".‘hello‘.MENCACHE_COMPRESSED.60)){

               echo "replaca ok";

          }else{

            echo "不ok";

          }

          //删除

          if($men->delete(‘key1‘)){

              echo ‘key1删除‘;

          }else{

               echo ‘key1不存在‘;

          }

          //过期时间最大是30天,但可以通过时间戳延长。将过期时间写成time()+31*3600*24即可!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!尤其要注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                                                      将expire设为0表示,永不过期(只要mencache不重启,就永远在mem中)

        ?>



        men2.php

        <?php

            

            class Dog{

              public $name;

              public $age;

              public function __construct($name.$age){

                     $this->name=$name;

                     $this->age=$age;

                }

              }

              //这个文件区操作mencached服务

              //创建一个men对象实例

              $men=new Memcache;

              if(!$men->connect("127.0.0.1".11211)){

                     die("连接失败");

              }

              //在另外的文件中取出对象时,有一个注意的地方,对于php5.2这个版本会提示错误,对5.3这个版本会提示incomplete信息,需要将Dog类黏贴过来。

              $dog=$men->get(‘key1‘);

              var_dump($dog);

              

       ?>

       练习:请大家使用php程序Memcache.dll完成对mencache的增删改查。





五:直接用php源代码操作mencached服务

    如果管理员不让我们去加载mencache.dll文件,我们可以直接通过原码操作(上网上找)

    我们先关闭扩展:注销extension:php_memcache.dll

    men3.php

    粘贴拷贝过去

    一般mencached-client.php!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!里面会有一段案例,黏贴到men3.php,稍加修改即可。








6:mencached机制的深入了解


  1)基于c/s架构,协议简单

  2)基于libevent的事件处理

  3)内置内存存储方式,在数据爆满的情况下使用LRU算法删除。

  4)基于客户端分布式的

     写一段代码说明一下

     men4.php

<?php


  //我的电脑上右两个mencached服务:进入路径,再启用一个9999端口。即为两个mencached服务。

  $mem=new Memcache();                     //先在php.ini里面打开扩展,优先使用扩展,次选现成的函数

  $mem->addServer(127.0.0.1‘.11211);

  $mem->addServer(‘127.0.0.1‘.9999);

  //这里注意,将key1放入到11211端口的memcache还是9999这个memcache就不需要我们去操心了,由$mem对象本身维护。(哈希,散列算法决定)

  if($mem->add(‘key1‘.‘hello‘.MEMCACHE_COMPRESSED.200)){

     echo ‘add  ok‘;

  }


  



?>

  如何从多个memcache服务中取出你的key1值

<?php

  $mem=new  Memcache;

  $mem->addServer(127.0.0.1‘.11211);

  $mem->addServer(‘127.0.0.1‘.9999);

  

  $val=$mem->get(‘key1‘);

  echo ‘程序中取出分布的值=‘.$val;


?>


总结:

1:mem服务相互之间数据不是同步的,数据时分布存放的

2:将什么数据放入到那一个memcached是有客户端的mem对象决定的

3:当执行addServer时,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接那一个mem服务,因此当你大量加入服务器到连接池,没有多余的开销。












7:Memcached细节讨论


   1)生命周期

      从数据放入Memcache开始计时,直到时间到了,就销毁,如果时间为0,则表示永不过期。

      mmemcache的数据被销毁的情况如下:

                      1:时间到

                      2:重启memcache服务

                      3:重启memcache服务所在的机器

                      4:delete/flush销毁数据

    2)如何将session数据放入Memcached服务中

       走一段代码

       mem6.php

<?php

  //传统的代码

  session_start();

  $_SESSION[‘name‘]=‘天龙八部‘;

  $_SESSION[‘city‘]=‘beijing‘;

  class Dog{

    public  $name;

  }

  $dog1=new Dog;

  $dog1->name=‘abcde‘;

  $_SESSION[‘dog‘]=$dog1;

  //如果session数据如mem,那么它一定是以session_id为key值进行添加

  //取出

  $name=$_SESSION[‘name‘];

  echo "name=$name";  

  echo "session=".session_id();

?>

  步骤:

  1)修改php.ini文件,搜session

     关于session_save_handler=?        files|user|memcache三种,换成第三种即可。

     关于session.save_path="?"    写成"tcp://127.0.0.1:11211"     

  3:测试一把,重启apache

    测试ok




思考一个问题:

如果管理员不让我们修改php.ini文件,我们如何处理session入memcached这个功能?

我们通过一个函数可以去动态地修改php.ini的配置信息!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!临时在本页面生效,不影响其它php页面,也不会去修改php.ini文件本身。

(将php.ini文件复原)


<?php

  //加入如下代码即可!!!!!!!!!!!!!!!!!!!!!!!!!!

  ini_set("session.save_handler"."memcache");

  ini_set("session.save_path"."tcp://127.0.0.1:9999");




  //传统的代码

  session_start();

  $_SESSION[‘name‘]=‘天龙八部‘;

  $_SESSION[‘city‘]=‘beijing‘;

  class Dog{

    public  $name;

  }

  $dog1=new Dog;

  $dog1->name=‘abcde‘;

  $_SESSION[‘dog‘]=$dog1;

  //如果session数据如mem,那么它一定是以session_id为key值进行添加

  //取出

  $name=$_SESSION[‘name‘];

  echo "name=$name";  

  echo "session=".session_id();

?>



php.ini文件里

safe_mode=off

safe_mode=on的区别在于安全模式给出的权限更小。






memcached与session的比较

memcached主要的目的是提速,因此它是一种无状态的数据,即:数据不与用户绑定。

session数据是与用户绑定的,因此它是一种有状态数据。


memcached安全性

如何使用memcached服务才是安全的?

在windows下,通过启用防火墙保护我们的memcached(放在内网)。

在linux下,也可以启用防火墙,

setup配置防火墙

iptables -a  input  -p tcp  -s  127.0.0.1 -dport 11211 -j  ACCEPT  




适合放入memcached的数据:变化频繁,具有不稳定的数据,不需要实时入库的数据适合放入memcached,还有门户网站的新闻等,觉得页面静态化不能满足。



与memcached相关相似的技术:Redis(key/value数据库)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!




本文出自 “枷罗博客” 博客,请务必保留此出处http://sun231013.blog.51cto.com/8558055/1576873

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。