首页 > 代码库 > Memcached笔记

Memcached笔记

Memcached的基本概念

是一种缓存技术(内存), 你可以把它想象成一张巨大的内存表:形式[他就是一个服务]

key                    val 

key(字符串)         可以放(字符串【二进制数据[视频、音频、图片],数值,数组,对象,)


安装memcache服务

步骤

1. 下载

2. 安装

 

卸载 memcached.exe d uninstall   (-d  daemon 后台程序)

停止服务 memcahced.exe d stop 

安装 memcached d install 

 

3. 测试是否安装成功

启动 

memcached d start 

我们使用 

netstat an   看看是否有 11211 端口在监听,如果在监听,则说明成.

netstat anb  (b 可以显示 是哪个程序在监听这个端口.)

如果现在,我要杀掉这个程序 ,windows 下  可以使用任务管理器杀死.

linux  kill -9 进程号         killall 进程名 

 

大部分同学安装Ok, 只有是xpok,

win7 的同学有一部分没有ok

a. 把 memcached.exe 放在 中文目录 这样不行

b. 安装使用的是 普通用户, 你要切换成 administror   ctrl+alt+delete

 

 

如何操作memcached 服务.

学习如何完成crud操作! (任务驱动 |  )

 

telnet 的具体使用

a. 登录到telnet 

语法 

telnet ip 端口 

 

登录到  11211 端口 

telnet 127.0.0.1 11211 

 

如何对mem进行 curd 操作

 

添加

add key1  0  60  5

 

说明  key1 表示 键值 ,可以自己指定

表示一个格式, 不变

60 存放在mem多长时间

表示存放的数据是多少个字节

 

查询

get 键值

举例

get hsp1 

说明如果 hsp1 不存在,或是是因为时间到而被 memcache 删除了,将得到空.

 

修改

有两种方法

 

replace 键值  时间 大小  【这里有一个注意事项,该键值必须存在】

举例:

replace hsp1 0 40 8

 

第二种方法:

set 键值 时间 大小 【如果这个键存在,则替换,如果不存在,则表示添加一个新的键值】

 

案例

set hsp1 0 60 5 

 

删除 

 

语法

delete 键值

现在,如果我们在mem服务中,需要做一个计数器(存放值一定是一个数),怎么办?

 

key          val

counter        0

add counter 0 0 100

incr key 数字

 

telnet使用ok!

 

如何使用memcache 的扩展来操作memcached  服务 

(1) 把 php_memcache.dll  拷贝 ~php/ext/目录

(2) 在 php.ini 中添加一句话

;引入php_memcache.dll

extension=php_memcache.dll

(3) 使用 PHP 程序 curd

<?php

 

//创建对象

$mem=new Memcache;

//连接到mem服务器

$mem->connect("127.0.0.1",11211);

//添加,该函数返回true

 

if($mem->add("hsp1","china",MEMCACHE_COMPRESSED,60)){


echo "添加ok";

}else{

echo "添加err";

}

 

//查询

 

$val=$mem->get("hsp1");

echo "val=$val";

echo "<br/>";

//修改 replace  set

if($mem->replace("hsp1","hello,world",MEMCACHE_COMPRESSED,60)){

echo "replace ok";

}else{

echo "replace 失败";

}

echo "<br/>";

//set 如果存在就替换,不存在,就添加

if($mem->set("hsp1","hello,world , 你好!",MEMCACHE_COMPRESSED,60)){

echo "set ok";

}else{

echo "set 失败";

}

 

echo "<br/>";

//删除

if($mem->delete("hsp1")){

echo "删除ok";


}

 

(4) 谈谈细节,加强

讨论memcache中什么数据类型可以放入字符串 ,数字 ,数组对象 ,资源

 

 

当我们在mem中存取对象是,在取的时候,我们需要在前面引入这个类的声明.

 

把这个代码:

<?php

 

//放入数组

$arr=array("1"=>"beijing","2"=>"天津");

//数组默认是序列号 

if($mem->add("city2",json_encode($arr),MEMCACHE_COMPRESSED,60)){

echo "city ok";

}else{

echo "city fail";

}


 

//对象

class Dog{

public $age;

public $color;

public function __construct($age,$color){

$this->age=$age;

$this->color=$color;

}

}

 

$dog1=new Dog(30,"红色");

 

if($mem->add("dog1",$dog1,MEMCACHE_COMPRESSED,60)){

echo "dog1 ok";

}else{

echo "dog1 fail";

}

echo "<br/>";

$mydog=$mem->get("dog1");

echo $mydog->age;

var_dump($mydog);

 

$con=mysql_connect("localhost","root","root");

echo "<br/>";

if($con){

//放入mem

if($mem->add("conn",$con,MEMCACHE_COMPRESSED,160)){

echo "资源添加ok";


}else{

echo "资源添加失败";

}

}


工作环境: apache 的 httpd.conf 文件 php.ini 文件是有其他人来管理,你没有权利去修改这些配置文件,但是你还希望去使用memcached 

 

解决方法我们使用原生态的代码来完成.->这里我们可以直接使用 

我们可以把 memcached-clinet.php 引入到我们的项目中,然后我就可以直接来完成了.

 

代码完成 crud操作.

① 先关闭 extension

② 我们写mem4.php 并引入我们的 memcached-clinet.php 一般说所有的技术文档,都会给你一个案例,所以你照这个案例可以快速使用

<?php

 

//直接使用函数来操作我们的memcached

 

include "memcached-client.php";

 

 $mc = new memcached(

array(

              ‘servers‘ => array(‘127.0.0.1:11211‘),

               ‘debug‘   => false,

               ‘compress_threshold‘ => 10240,

               ‘persistant‘ => true));

//添加 【这里仍然支持添加 数组,对象,数值 】

   if($mc->set(‘hsp1‘, "你好!北京!",60)){

echo "ok";

   }else{

   echo "fail!";

   }

   //获取

   $val=$mc->get("hsp1");

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

 

   //修改 直接使用set函数,就是 replace

   if($mc->replace("hsp1","北京",30)){

   echo "<br/>修改成功!";

   }else{

  echo "<br/>修改fail!";

   }


 

 

 //获取

   $val=$mc->get("hsp1");

 //  echo "<br/>"."修改后 val=$val";


if(is_array($val)){


echo "<pre>";

print_r($val);

echo "</pre>";

}else if(is_float($val)){

 

echo "<br/>"."修改后 val=$val";


}else if(is_string($val)){

 

echo "<br/>"."修改后 val=$val";


}

 

   //删除

 

/*  if($mc->delete("hsp1")){

   echo "<br/>删除成功!";

   }else{

  echo "<br/>删除fail!";

   }*/

 

关于memcache的机制

1. 是基于 c/s 2. 底层的协议是 普通文本

2. 是基于 libevent机制处理

3. memcache的数据是放在内存

4. memcache本身支持 LRU 算法      

[算法/网络/数据库/操作系统+编译原理 pl0[if + -]] 

5. 基于客户端分布式.示意图

spacer.gif 

 

memcache细节

1. 生命周期

数据的生命周期是指定的,只有把数据放入就开始计时,只要时间到,就销毁.

session(1440s)  如果你没有关闭浏览器,并且没有使用session 1440后销毁

1439使用一次这个sesion ,又开始重新计时.

2. 如何把session 放入memcache服务器

sesion 垃圾回收的概率是 session.gc_probability/ session.gc_divisor 

步骤

(1) 因为session 默认是放在文件中, windows下 c:/windows/Temp

(2) 重新配置php.ini 把关于session配置修

session.save_handler = memcache

修改路径

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

 

(3) 如果我们不去修改php.ini 也达到这样的效果

可以使用 ini_set 函数来玩

 

代码:

 

<?php

 

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

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

  session_start();

  $_SESSION[‘name‘]="shunping";

 

  echo "<br/>存放sesionok";

  echo "<br/>session_id=".session_id();

  //取出

  $val=$_SESSION[‘name‘];

  echo "<br/>session name=".$val;

 

(4) memcache是无用户状态,也就是说,是所有用户共享的数据

(5) 安全性.

windows. 下我们使用防火墙  同时 打开 80端口. , 只让我们自己 php程序去操作我们的memached服务。这样我们的memcache就安全,

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

 

总结:

--我自己的一个小结如何决定是否使用memcached

--如果是一个小网站,pv(page view)值不大,就不考虑使用memcache

--变化频繁,查询频繁,但是不一定写入数据库(适合memcache)

--变化频繁一变化就要入库[比如股票,金融.](不适合memcache)

 

 

memcache 和 session 对比

1. memcache 放入内存,session默认放入文件,但是通过配置,也可以入memcached

2. 生命周期 (memcahce 数据一旦创建就开始时间,到时就销毁  , session 创建后计时,但是如果在没有成垃圾前,你又使用过一次,则重新计算)

3. 解决的问题不一样 memcache为了提升速度 , session 是用于追踪用户的行为

相关技术  Redis  也是 key/value 一种缓存技术.