`
lvwenwen
  • 浏览: 932203 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

memcached笔记

阅读更多
 memcached 的基本概念

memcached 是一个高效的分布式的内存对象缓存系统 ,他可以支持把各种php的数据(array,对象,基本数据类型)放入到它管理的内存中.


 使用memached的好处是什么?


针对上面的的要求有三种方案
1. 传统的方法
<?php
$stu_id=$_GET[‘stu_id’];

//查询数据库

smaryt->assign(“view”);


?>

2. 页面静态化
<?php

$stu_id=$_GET[‘stu_id’];
$html_file=”stu_id1.html”
if(file_exitsts($html_file)){
//显示
exit
}
//查询数据库
//缓存.

smaryt->assign(“view”);

?>

3. 使用内存缓存
<?php
$stu_id=$_GET[‘stu_id’];
//到memcached缓存中,看看有没有学生信息
$mem=new Memcache;
if($info=$mem->get($stu_id)){
//取出学生信息
echo $info;
exit
}
//到数据库查询
ob_start();
$conn=....
.....
echo “..”;
//把从数据库中获取的结果,放入memcache中
$mem->add($stu_id,ob_get_contents(),MEMCACHE_COMPRESSED,60*60*24);
?>

访问速度
数据库<文件<内存

 原理图



 安装步骤

①下载memcached软件
②将memcached软件拷贝到某个目录,最好放在php开发环境目录下,便于管理
③安装  memcached –d install [卸载使用 memcached -d uninstall]
④启动 memcached 服务
(1)直接通过界面启动该服务
(2)在控制台下启动 memcached –d start   [命令一览表]
⑤查看memcached 服务是否启动成功! 默认端口11211


我们一起看看memcached 常用的命令.

特别说明;如果你的网站,需要的memcached 的内存大于64m,应当这样启动
memcached –m 256m –d start    LRU
如果你希望换一个端口
memcached -d -m 30 -l 127.0.0.1 -p 9000 -d start





面试题,请举例5个常用端口
80 apache/iis
21  ftp
23 telnet
3306  mysql
1521 oracle
1433 sql server
8080 tomcat

 使用方法

telnet -----> memcached缓存系统 (教学)

crud (create/read/upate/delete)

添加:
1. 连接到memcached
telnet 192.168.1.100 11211
add name 0 60 5     [说明 add 是指令名  name 是key的名字 (是以key/value存放), 0 标志, 60 表示数据存放 60s   5表示 放入多大数据 ], 如果一个key已经存在,再放入是失败的.

get name [获取 name的值]


//更新
set name 0 60 5   [如果 name 这个key存在,就是更新, 如果key不存在,就是添加]
//删除
delete key值


//其它用法看手册


 使用memcache 扩展(一堆函数)来操作 memcached缓存系统

① 在php.ini 中配置 extension
放入到 php/ ext /目录
② 打开extension
;这里启用memcache.dll扩展
extension=php_memcache.dll
③ 编程测试
代码(测试放入php的各种数据类型)
<?php

//1.实例化一个Memcache对象
$mem=new Memcache;

//2. 连接到指定的memcache中
$mem->connect("127.0.0.1",11211);
//0表示不压缩数据,如果使用压缩MEMCACHE_COMPRESSED
if(!$mem->add("name","shunping",0,30)){
echo "有哥们放入了";
}else{
echo "ok!";
}

//可以放入数值
if(!$mem->add("age",100,0,30)){
echo "age有哥们放入了";
}else{
echo "ok!";
}

//可以放入boolean

if(!$mem->set("ok",true,0,30)){
echo "ok有哥们放入了";
}else{
echo "ok!";
}

//放入数组

$arr1=array("aa"=>"北京","bb"=>"天津");

//对数组进行序列化,在网络传输的时候,为了保证,数据类型的不丢失,
//先序列化,再发生.
//$arr1=serialize($arr1);

$arr2=json_encode($arr1);
print_r($arr2);


$mem->add("arr",$arr1,MEMCACHE_COMPRESSED,100);

//对象

require "Person.class.php";

$person=new Person(10,"xiaoming");

$mem->add("per1",$person,MEMCACHE_COMPRESSED,100);


//取出
$per2=$mem->get("per1");

var_dump($per2);
echo "对象名字=".$per2->name;

//string, int,float, boolean  array object null resource


//不能把resource 类型放入到memcache
$con=mysql_connect("localhost","root","root");

echo "<br/>";
var_dump($con);

$mem->add("mylink",$con);



?>
.

代码: 用于获取各种数据
<?php

//获取
$mem=new Memcache;
$mem->connect("localhost",11211);
if($val=$mem->get("name")){
echo "val=$val";
}else{
echo "没有这个值";
}


/*获取数值*/
if($val=$mem->get("age")){
echo "age=$val";
}else{
echo "没有这个值";
}
/*布尔值*/
echo "<br/>";
$val=$mem->get("ok");

echo "ok=$val";

echo "<br/>";

$arr1=$mem->get("arr");

echo "<pre>";
var_dump($arr1);
echo "</pre>";

echo "<br/>对象的值..";
require "Person.class.php";
//取出
$per2=$mem->get("per1");
var_dump($per2);
echo "对象名字=".$per2->name;
echo "<br/>连接";
var_dump( $mem->get("mylink"));
?>

结论: //string, int,float, boolean  array object null resource 中除了 resource 不能存放,其它都可以.

分析memcache价值



补充: 关于如何使用多个memcached 缓存服务器.
<?php

$mem=new Memcache();

//如果我们网站,需要多个memached缓存系统.
//$mem->connect("localhost",11211); (立即向localhost的11211端口发出连接)
$mem->addServer("192.168.1.100",11211);//256 ->10m
$mem->addServer("192.168.1.200",11211);
$mem->addServer("192.168.1.222",11211);
//创建多个memcache服务使用.


$mem->add("name","zs",0,100);

?>



//使用socket来操作我们的memcached缓存系统.

代码:

<?php

require "memcached-client.php";

$mc = new memcached(array(
               'servers' => array('127.0.0.1:11211'), //如果有多个memcached服务器使用可以使用,号间隔添加
               'debug'   => false,
               'compress_threshold' => 10240,
               'persistant' => true));

$mc->add('key', '顺平');
// $mc->replace('key', 'some random string');
$val = $mc->get('key');

echo "key=".$val;
?>

面试题: 请说明memcached 机制:
1. 是c/s结构,使用简单文本通讯
2. 基于libevent处理并发
3. 是内存缓存
4. 基于客户端的分布式
5.
6. .


php程序(1. memcache 扩展  2. memcached 扩展 (php_memcached.dll), 3. 使用socket访问) ---->memcachd 缓存系统


 memcached 的细节
1. 生命周期, 是在add 数据的时候指定的.
2. 如何配置,将session数据,自动保存到memcached服务器中.

思路 : 在默认情况下 session 数据是放在文件中. c:/windows/temp

步骤:
① 在php.ini 文件中
;把session数据放入memcache
session.save_handler = memcache
;这里指定放到哪个memcached服务器
session.save_path = "tcp://127.0.0.1:11211"

使用
<?php
session_start();
$_SESSION['name']='xiaohong';
//现在我们希望把session数据放入到memcached缓存系统中.
echo session_id()."<br/>";
echo $_SESSION['name'];
?>

小结: 我们只需要在php.ini中作一个配置,然后再使用session时候,还是老规矩,只是这个时候,我们的session数据,已经放到memcached中

 memcache的安全性

windows 下,设置防火墙.

原理图:

linux下
iptables -a input -p 协议 -s 可以访问ip -dport 端口 -j ACCEPT


小结如何使用memcached 的因素:

--我自己的一个小结如何决定是否使用memcached
--如果是一个小网站,pv值不大,就不考虑使用memcache了
--变化频繁,查询频繁,但是不一定写入数据库(适合memcached)(用户在线状态.)
--变化频繁, 一变化就要入库[比如股票,金融.](不适合memcached)
--变化不频繁,查询频繁,不管如不入库,都比较适合memcache。(新浪的新闻频道)



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics