Memcached技术

Memcached技术

 

介绍:

memcached是一种缓存技术他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,

memachec 中维护了一张大的hashtable,该表是在内存,表的结构是

key    value

字串  (字串,数值,数组,对象,布尔,二进制数据,null

 像那种频繁的变化,而丢了也无所谓的数据就可以放在内存中去。

原理说明:


 

 上图的说明:memcached的key一般是字串,不能重复,value可以放入字符串,数值,数组,对象,布尔值,二进制数据【图片或视频】

  • 安装并使用memcached

安装步骤

  1. 下载memcached软件
  2. 安装

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

memcached.exe –d install

  1. 启动memcached

第一种,可以到服务点击启动

第二种命令行

memcached.exe –m 200MB –d start  【以deamon方式启动,默认64M

 

如果你在启动时,win7启动不成功则可以使用如下方法

memcached.exe –p 端口号

 

netstat -ano 命令 如果看到11211这个端口就说明启动成功

netstat -anb 命令可以看到哪个程序在监听哪个端口。还可以看到哪些用户连接到我的服务器

启动方法不要关闭控制台.

 

端口号的范围 : 0-65535  因为端口号是用两个字节来表示

有名端口: 0-1024 已经用程序使用 , apache 80  , mysql 3306 , ftp 21 , ssh 22

oracle: 1521, stmp: 25(邮件传输协议)

 

使用netstat –an 如果看到 11211端口在监听,说明启动ok

netstat –anb 是哪个程序监听这个指令还可以看到有哪些用户连接到我们的服务器.

 netstat -a ip地址    

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

  1. 如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.

你切换成adminstrator , 去安装,在启动

  1. 你的memcached.exe 目录有中文,或特殊字符保证目录没有中文和特殊字符.

 

  1. 准备研究如果对memcached进行curd操作.


看看telnet如何操作curd

 

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

telnet 127.0.0.1  11211


如果你们不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:\windows\system32 即可

  1. 增加

基本语法是:

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

举例:

add key1 0 30 5

 

  1. 如何获取

基本语法是:

get key

get key1

  1. 修改

 

set key 0 存放时间数据大小.

 

举例:

set key1 0 40 5

如果key1不存在,则相当于增加新,如果存在,则相当有替换

 

replace key存放时间数据大小

replace key1 0 40 5

如果key1不存在,则失败,这个指令要求key必须存在.

 

  1. 删除

基本语法是

delete key

比如

delete key1

 

append

Append data to existing key

append key 0 60 15

prepend

Prepend data to existing key

prepend key 0 60 15

 

 

flush_all 可以统一把数据清空.

 

这里主要大家可以去计算出命中率 cmd_hits/cmd_get . 越高越好.

 

 

 

 

  • 如何使用php程序操作我们的memcached服务 curd.

步骤,准备工作.

  1. php_memcache.dll 文件拷贝 phpext 

不同版本的php 所使用的php_memcache.dll 的版本不一样

  1. 修改php.ini文件,加载php_memcache.dll (该文件就是封装了一堆函数)

;加载php_memcache.dll 文件

extension=php_memcache.dll

  1. 重新启动apache
  2. 我们写程序来完成curd操作.

 

细节在我们添加数据的时候,如果

boolMemcache::add ( string$key , mixed$var [, int$flag [, int$expire ]] )

如果报 expire 设为表示,永不过期.(只要memcache不重新启动,就永远在mem)

exprie 直接给的是秒数,则最大 30*3600*24

如果你希望保持时间超过30  time()+天数*3600*24 即可

 

最后代码:

mem1.php

 

<?php

             

    //创建一个mem对象实例

       $mem=new Memcache;

    

       if(!$mem->connect("127.0.0.1",11211)){

              die('连接失败!');

       }

 

       //增加

 

       //1.增加一个字串

/*    if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){

             

              echo '添加ok';

       }*/

      

       //2.添加数值

/*    if($mem->set('key1',100,MEMCACHE_COMPRESSED,60)){

             

              echo '添加ok';

       }*/

 

       //3.添加数组

       //在添加数组是,根据需要希望序列号放入  ,

       //serialize<=>unserialize如果根据需要,也可以json_encode <=> json_decode

       $arr=array("bj",'tj');

       if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){

             

              echo '添加数组ok99111';

       }

       //4.添加对象

/*    class Dog{

              public $name;

              public $age;

              public function __construct($name,$age){

                     $this->name=$name;

                     $this->age=$age;

              }

       }

 

       $dog1=new Dog('小狗',50);

       if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){

             

              echo '添加对象ok';

       }*/

 

       //5.添加null 布尔值

/*    if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){

             

              echo '添加布尔ok';

       }*/

 

       //6. 资源类型放入.

/*    $con=mysql_connect("127.0.0.1","root","root");

       if(!$con){

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

       }

       var_dump($con);

       echo "<br/>";

       if($mem->set('key1',$con,MEMCACHE_COMPRESSED,60)){

             

              echo '添加资源ok';

       }*/

 

 

       //查询

 

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

 

       var_dump($val);

 

       //修改

       //可以使用replace

       if($mem->replace("key11",'hello',MEMCACHE_COMPRESSED,60)){

              echo 'replace ok';

       }else{

              echo 'replace no ok';

       }

 

 

 

       //删除

       echo "<br/>";

       if($mem->delete('key14')){

              echo 'key14 删除';

       }else{

              echo 'key14不存在';

       }

 

 

mem2.php

 

<?php

 

      

      

 

       //这个文件去操作memcached服务

 

        //创建一个mem对象实例

       $mem=new Memcache;

    

       if(!$mem->connect("127.0.0.1",11211)){

              die('连接失败!');

       }

 

       //在另外文件中取出对象时,有个注意的地方,对应php5.2这个版本会提示错误,

       //php5.3这个版本会提示 incomplete 信息解决方法是声明类定义即可

 

       class Dog{

              public $name;

              public $age;

              public function __construct($name,$age){

                     $this->name=$name;

                     $this->age=$age;

              }

       }

 

       $dog=$mem->get('key1');

 

       var_dump($dog);

 

test.php 说明serilize  json_encode用法:

//什么时候使用serilize 什么时候使用json_encode [ajax配合]

 

 

 

练习请大家使用php 程序 memcache.dll 完成对memcahce增删改查

20min

 

  • 如何使用PHP源码来操作memcached服务

如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.

 

关闭扩展.

 

代码mem3.php

<?php

 

 require_once 'memcached-client.php';

 

  $mc = new memcached(array(

               'servers' => array('127.0.0.1:11211'), //连接的memcacheip和端口

               'debug'   => false, //是否debug

               'compress_threshold' => 10240, /*最大压缩*/

               'persistant' => true)); /*是否是持久连接*/

 

 

  $mc->set('key1', array('some', 'array'));

 // $mc->replace('key', 'some random string');

 

  $val = $mc->get('key1');

       var_dump($val);

       //修改

       $mc->replace('key1', "北京");

       $val = $mc->get('key1');

 

       var_dump($val);

       //删除

       $mc->delete('key1');

  $val = $mc->get('key1');

       echo "删除后";

       var_dump($val);

 

 

  • Memcached 机制的深入了解

 

 

 , memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除

 

写段代码说明: mem4.php

 

mem5.php 取出.

       

 

总结:

  1. mem服务的数据不是同步数据是分布的
  2. 把什么数据放入到哪个memcached是由客户端的mem对象决定
  3. 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销

 

  • memcache的细节讨论
  1. 生命周期

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

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

  1. 时间到
  2. 重启memcached服务
  3. 重启memcached服务所在的机器
  4. delete / flush 销毁数据
  5. 如何把session数据放入到memcached服务中.

步骤:

  1. 修改php.ini的配置文件

如下:

;[sesson.save_handler user|files|memcache]

session.save_handler = memcache

session.save_path = "tcp://127.0.0.1:11211"

  1. 测试一把,重启apache

测试ok

<?php

 

       //传统的代码

       session_start();

       $_SESSION['name']='天龙八部300';

       $_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 "sessionid=".session_id();

 

 

  • 思考,如果管理员,不让我们修改 php.ini 文件,我们如何处理sessionmemcached这个功能我们通过一个函数可以去修改 php.ini 的配置.

 

代码:

<?php

 

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

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

 

同时你也可以通过 ini_set 去动态的修改对php.ini 的其它设置。但是他不影响其它php页面,也不会去修改php.ini 文件本身只对本页面生效.

 

  • memcached vs session比较

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

session数据是和绑定的,因此是一种有状态数据.

 

  • memached安全性

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

 

windows下通过启用防火墙来保护我们的memcached,原理图:

 

linux 也可以使用防火墙.

setup 配置防火墙

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

 

  • 什么样的数据适合放入memcached?

memcached技术类似是redis (key/value数据库)

 


 

 

 

 

 

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值