Nosql数据库-memcached

一.原理介绍

介绍:

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

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

key    value

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


二.安装

Ubuntu上安装
安装:sudo apt-get install memcached
pstree -G
killall -9 memcached
启动:
---------启动多个节点memcached start--------
在/etc/init.d      在/usr/bin目录下
memcached -d -p 11212 -u nobody -c 1024 -m 64
memcached -d -p 11213 -u nobody -c 1024 -m 64
---------启动多个节点memcached   end--------

memcached -m 200 -d start
telnet localhost 11211

******************************************
win7上安装
  1. 下载memcached软件
  2. 安装

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

memcached.exe –d install

  1. 启动memcached

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

第二种命令行

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

 

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

memcached.exe –p 端口号

 

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

 

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

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

oracle: 1521, stmp: 25

 

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

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

 

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

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

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

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

 

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

 

三.telnet操作memcached

看看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

  • 如何使用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

extension_dir = "C:/wamp/bin/php/php5.3.10/ext"

  1. 重新启动apache
  2. 我们写程序来完成curd操作.
细节 在我们添加数据的时候,如果

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

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

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

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

------------mem1.php      start-----------

<?php

header('Content-type: text/html; charset=utf8');

    //创建一个mem对象实例

 $mem=new Memcache;

     

 if(!$mem->connect("192.168.0.104",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)){

 //存放超过30天 用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. 资源类型放入.

 //55b07d989e1a2.gz.cdb.myqcloud.com    120.27.43.71   203.195.179.183

 /*$con=mysql_connect("203.195.179.183","root","Yue920611Fang","12613");

 if(!$con){

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

 }

 var_dump($con);

 echo "<br/>";

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

 

  echo '添加资源ok';

 }*/

 //查询

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

 //print_r($val)

 //echo '<br/>val='.$val

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

 }

?>

------------mem1.php      end-----------


------------mem2.php      start-----------

<?php

 header('Content-type: text/html; charset=utf8');

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

  //创建一个mem对象实例

 $mem=new Memcache;

     

 if(!$mem->connect("192.168.0.104",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);

?>

------------mem2.php      end-----------


------------test.php      start-----------

//test.php 说明serilize  json_encode用法:

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


<?php

header('Content-type: text/html; charset=utf8');

 class Dog{

  public $name;

  public $age;

  public function __construct($name,$age){

   $this->name=$name;

   $this->age=$age;

  }

 }

 $dog2=new Dog('小黄',40);

 //我希望把这个对象保存到磁盘. ->serilize

 file_put_contents("d:/my.log",serialize($dog2));

 echo 'save ok!';

 $dog=unserialize(file_get_contents("d:/my.log"));

 echo "<br/>";

 echo $dog->name."<br/>";

 echo $dog->age."<br/>";

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

 //json格式保存

 file_put_contents("d:/my2.log",json_encode($arr));

 /*$host="127.0.0.1:1134";

  list ($ip, $port) = explode (":", $host);

  echo $ip."===".$port;*/

?>

------------test.php      end-----------



------------php源码操作memcached      start-----------

// 如果管理员不让我们去加载  memcache.dll  文件,我们可以直接通过源码操作 .
memcached-client.php 
关闭扩展  、关闭错误提示  display_errors = Off

****mem3.php   start*******
<?php
 header('Content-type: text/html; charset=utf8');
 require_once 'memcached-client.php';
  $mc = new memcached(array(
               'servers' => array('192.168.0.104:11211'), //连接的memcacheip和端口
               'debug'   => false, //是否debug
               'compress_threshold' => 10240, //最大压缩
               'persistant' => false)); /*是否是持久连接*/
 
  $mc->set('key1', array('some', 'array'));
 // $mc->replace('key', 'some random string');
  $val = $mc->get('key1');
 var_dump($val);
 //修改
 $mc->replace('key1', "beijin");
 $val = $mc->get('key1');
 var_dump($val);
 //删除
 $mc->delete('key1');
  $val = $mc->get('key1');
 echo "删除后";
 var_dump($val);
?>

****mem3.php   end*******

------------php源码操作memcached      end-----------


五.分布式memcached

写段代码说明客户端分布: mem4.php

-------- mem4.php     start-------------------
<?php
 //我的电脑上有两个memcahced服务.
 $mem=new Memcache;
 $mem->addServer('192.168.0.104',11211);
 $mem->addServer('192.168.0.104',9999);//memcached -d -p 9999 -u nobody -c 1024 -m 200
 //$mem->addServer('127.0.0.1',9998);//memcached -d -p 9998 -u nobody -c 1024 -m 200
 //$mem->addServer('127.0.0.1',9997);//memcached -d -p 9997 -u nobody -c 1024 -m 200
 //$mem->addServer('127.0.0.1',9996);//memcached -d -p 9996 -u nobody -c 1024 -m 200
 //这里注意,把key1,放入到 11211端口的mem还是
 //9999 端口的mem就不要我们操心,有$mem对象本身维护.
 if($mem->set('key1','hello',MEMCACHE_COMPRESSED,300)){
  echo 'add key1 ok!<br/>';
 }
 if($mem->set('key2','hello2',MEMCACHE_COMPRESSED,300)){
  echo 'add key2 ok!<br/>';
 }
 if($mem->set('key3','hello3',MEMCACHE_COMPRESSED,300)){
  echo 'add key3 ok!<br/>';
 }
?>
-------- mem4.php     end-------------------


-------- 取值mem5.php     start-------------------
<?php
header('Content-type: text/html; charset=utf8');
 //如何从多个mem中取出你的key?
 $mem=new Memcache;
 $mem->addServer('192.168.0.104',11211);
 $mem->addServer('192.168.0.104',9999);
 $val1=$mem->get('key1');
 $val2=$mem->get('key2');
 $val3=$mem->get('key3');
 
 echo '程序中取出分布key1值='.$val1."<br/>";
 echo '程序中取出分布key2值='.$val2."<br/>";
 echo '程序中取出分布key3值='.$val3."<br/>";
 ?>
-------- 取值mem5.php     end-------------------

总结:

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

六.session入memcached

大量session放入memcached

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

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

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

    ①时间到

    ②重启 memcached 服务

    ③重启 memcached 服务所在的机器

       ④delete / flush  销毁数据


  1. 如何把session数据放入到memcached服务中.

步骤:

    ①修改 php.ini 的配置文件

如下:

;[sesson.save_handler user|files|memcache]

session.save_handler = memcache

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

  1. 测试一把,重启apache

--------mem6.php   start--------------
<?php
 header('Content-type: text/html; charset=utf8');
//如果管理员,不让我们修改  php.ini  文件,我们如何处理 session memcached 这个功能 我们通过一个
//函数可以去修改  php.ini  的配置
 ini_set("session.save_handler","memcache");
 ini_set("session.save_path","tcp://192.168.0.104:11211");
 //传统的代码
 session_start();
 $_SESSION['name']='4000';
 $_SESSION['city']='beijing';
 class Dog{
  public $name;
 }

 $dog1=new Dog;
 $dog1->name='abcde';
 $_SESSION['dog']=$dog1;

 //如果session数据入mem,那他一定是以session_id为
 //key值进行添加
 
 //取出
 $name=$_SESSION['name'];
 $city=$_SESSION['name'];
 $dog_s=$_SESSION['dog'];
 echo "name=$name"."<br/>";
 echo "city=$city"."<br/>";
 echo "sessionidu=".session_id()."<br/>";
 echo "dog=".$dog_s->name."<br/>";
 ?>
--------mem6.php   end--------------

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


七、所有源码
百度云盘:http://pan.baidu.com/s/1dDnYrlR



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值