一.原理介绍
介绍:
memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,
在memachec 中维护了一张大的hashtable表,该表是在内存,表的结构是
key value
字串 (字串,数值,数组,对象,布尔,二进制数据,null)
二.安装
- 下载memcached软件
- 安装
进入cmd ,切换到memcached.exe 文件所在目录
memcached.exe –d install
- 启动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 是哪个程序监听, 这个指令还可以看到有哪些用户连接到我们的服务器.
如果没有安装好,原因可能
- 如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.
你切换成adminstrator , 去安装,在启动
- 你的memcached.exe 目录有中文,或特殊字符, 保证目录没有中文和特殊字符.
- 准备研究如果对memcached进行curd操作.
看看telnet如何操作(curd)
- 登录到telnet连接到 memcached服务
telnet 127.0.0.1 11211
如果你们不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:\windows\system32 即可
- 增加
基本语法是:
add key名 0 存放时间(秒) 数据大小(字符)
举例:
add key1 0 30 5
- 如何获取
基本语法是:
get key值
get key1
- 修改
set key名 0 存放时间数据大小.
举例:
set key1 0 40 5
☞如果key1不存在,则相当于增加新,如果存在,则相当有替换
replace key名存放时间数据大小
replace key1 0 40 5
☞如果key1不存在,则失败,这个指令要求key必须存在.
- 删除
基本语法是
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.
步骤,准备工作.
- 把php_memcache.dll 文件拷贝 php的ext 下
☞不同版本的php 所使用的php_memcache.dll 的版本不一样
- 修改php.ini文件,加载php_memcache.dll (该文件就是封装了一堆函数)
;加载php_memcache.dll 文件
extension=php_memcache.dll
extension_dir = "C:/wamp/bin/php/php5.3.10/ext"
- 重新启动apache
- 我们写程序来完成curd操作.
bool Memcache::add ( string $key
, mixed $var
[, int $flag
[, int $expire
]] )
如果报 expire 设为0 表示,永不过期.(只要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不存在';
}
?>
------------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-----------
------------php源码操作memcached end-----------
写段代码说明客户端分布: mem4.php
总结:
- mem服务的数据不是同步, 数据是分布的
- 把什么数据放入到哪个memcached是由客户端的mem对象决定
- 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销
六.session入memcached
大量session放入memcached
- memcache的细节讨论
- 生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:
①时间到- 如何把session数据放入到memcached服务中.
步骤:
①修改 php.ini 的配置文件如下:
;[sesson.save_handler 有user|files|memcache]
session.save_handler = memcache
session.save_path = "tcp://192.168.0.104:11211"
- 测试一把,重启apache
同时你也可以通过 ini_set 去动态的修改对php.ini 的其它设置。但是他不影响其它php页面,也不会去修改php.ini 文件本身, 只对本页面生效.