memcached在widdows环境下的详细剖析

更多内容清访问www.phptuku.com
一.memcached 基本概念

    Memcached是一个高性能的分布式的内存对象缓存系统,用于减少数据库负载,提升性能。包括服务端和客户端。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,通过自己的算法开维护数据的操作。它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
这里写图片描述

二.memcached的安装(Windows下的安装)

  1. 下载memcached软件,http://memcached.org/download
  2. 将memcached软件拷贝到某个目录,最好放在php开发环境目录下,与apache,php,mysql同级目录,便于管理
  3. 安装 memcached –d install [卸载使用 memcached -d uninstall
  4. 启动 memcached 服务
    (1)直接通过界面启动该服务
    (2)在控制台下启动 memcached –d start
    (3)查看memcached 服务是否启动成功,可使用命令: memcached -h ,出现如下表示成功
    这里写图片描述
    参数说明:
    -p 监听的端口
    -l 连接的IP地址, 默认是本机
    -d start 启动memcached服务
    -d restart 重起memcached服务
    -d stop|shutdown 关闭正在运行的memcached服务
    -d install 安装memcached服务
    -d uninstall 卸载memcached服务
    -u 以的身份运行 (仅在以root运行的时候有效)
    -m 最大内存使用,单位MB。默认64MB
    -M 内存耗尽时返回错误,而不是删除项
    -c 最大同时连接数,默认是1024
    -f 块大小增长因子,默认是1.25
    -n 最小分配空间,key+value+flags默认是48
    -h 显示帮助

三.telnet操作memcached(CURD)

登录到telnet,连接到memcached服务,命令窗口下输入telnet 127.0.0.1 11211,

这里写图片描述

回车出现如下,输入任何东西都不会显现出来,看不到任何东西,这是因为Win7 中将telnet 回显功能关闭了

这里写图片描述

对当前框同时按下 “CTRL ”和“]” 健,将进入如下页面:

这里写图片描述

输入 “set localecho”,开启回显telnet回显功能

这里写图片描述

按下Enter键,进入telnet 交互界面,这时候用户可以看到自己的输入了
这里写图片描述

telnet写入memcache命令格式

 <command name> <key> <flags> <exptime> <bytes>  <data block>

参数说明:
command name:set/add/replace
key:查找关键字
flags:整型参数,客户机使用它存储关于键值对的额外信息
exptime:该数据的存活时间(以秒为单位,0 表示永远)
bytes:存储字节数
data block:存储的数据块(可直接理解为key-value结构中的value)

三.PHP操作memcached(CURD)

php操作memcached有以下三种形式:
  • memcache扩展
  • memcached扩展
  • Sokket套接字操作,memcached-client.php

1.如何使用php操作memcached服务

(1)把php_memcache.dll文件拷贝到php的ext下
注意:不同版本的php 所使用的 php_memcache.dll 的版本不一样
(2)修改php.ono配置,加载php_memcache.dll文件,extension=php_memcache.dll
(3)重新启动apache
(4)写代码完成curd操作

<?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不存在';
    }

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

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

<?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);

3.memcached机制深入了解

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

  • c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器。
  • memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据

②基于libevent的事件处理

  • libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。
  • Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。

③内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

④基于客户端的分布式

  • memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
  • 这里写图片描述
<?php

    //我的电脑上有两个memcahced服务.

    $mem=new Memcache;

    $mem->addServer('127.0.0.1',11211);
    $mem->addServer('127.0.0.1',9999);
    $mem->addServer('127.0.0.1',9998);
    $mem->addServer('127.0.0.1',9997);
    $mem->addServer('127.0.0.1',9996);

    //这里注意,把key1,放入到 11211端口的mem还是
    //9999 端口的mem就不要我们操心,有$mem对象本身维护.
    if($mem->set('key1','hello',MEMCACHE_COMPRESSED,300)){
        echo 'add ok!';
    }
    if($mem->set('key2','hello2',MEMCACHE_COMPRESSED,300)){
        echo 'add ok!';
    }
    if($mem->set('key3','hello3',MEMCACHE_COMPRESSED,300)){
        echo 'add ok!';
    }
<?php

    //如何从多个mem中取出你的key?

    $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服务,因此当你大量加入服务器到连接池,没有多余开销

4.memcached细节

① 生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:

  1. 时间到
  2. 重启memcached服务
  3. 重启memcached服务所在的机器
  4. delete / flush 销毁数据
    ② 如何把session数据放入到memcached服务中.
    步骤:
  5. 修改php.ini的配置文件
    如下:
    ;[sesson.save_handler 有user|files|memcache]
    session.save_handler = memcache
    session.save_path = “tcp://127.0.0.1:11211”
    ③ 测试一把,重启apache
    测试ok

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章