memcached

来源:互联网 发布:c语言余弦相似度 编辑:程序博客网 时间:2024/06/18 13:37
memcached技术的主要目的提速,//基于c/s架构
在memachec 中维护了一张大的hashtable表 ,该表是在内存,表的结构是
key    value
字串(不能重复)  (字串,数值,数组,对象,布尔,二进制数据,null)








安装并使用memcached
//服务端的安装


memcached需要依赖到以下的一系列包
gcc
libevent
glibc-devel 


下载
cd /home/download 
wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
wget http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz


安装
tar -zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr/local/libevent
make && make install


tar -zxvf memcached-1.4.0.tar.gz
cd memcached-1.4.0
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install


启动
/usr/local/memcached/bin/memcached -d -m 64 -u root -p 11211 -c 1024 -P /var/memcached.pid 
-d 为守护进程
-m 为分配的内存量
-u 运行memcached的用户
-p 监听的端口
-c 最大的并发连接数
-P 保存pid文件


还有很多的启动选项,通过帮助查看
/usr/local/memcached/bin/memcached -h 


测试
在windows开启命令行


telnet 192.168.1.100 11211


用telnet测试一下以下命令


stats 查询状态


version 查询版本


quit 退出


flush_all 清空缓存数据
 














//使用php程序操作memcached服务 curd.




步骤,准备工作.
//扩展资源包
把 php_memcache.dll 文件拷贝 php的ext 下


☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样


//启用扩展,修改php.ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)


extension=php_memcache.dll  //加载php_memcache.dll 文件


//重新启动apache


//用php程序来完成curd操作.


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


//若expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中)


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


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


步骤
//实例化一个Memcache对象
//以socket  ip+端口号形式,连接Memcached服务
//Curd操作


最后代码:
mem1.php 


<?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';
}*/




//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';
}*/







//查询


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




mem2.php


<?php






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


//创建一个mem对象实例
$mem=new Memcache;
     
if(!$mem->connect("127.0.0.1",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);


test.php 说明serilize 和 json_encode用法:
//什么时候使用serilize 什么时候使用json_encode [ajax配合]


 






Memcached 机制的深入了解


//服务器客户端通信采用的是简单的文本行协议。
//libevent事件处理,支持高并发
// memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除
//基于客户端的分布式,
memcached作为缓存层,需要缓存的内容会越来越多,当一台服务器无法承受所有缓存的内


容时,就需要考虑将memcache调整为分布式,通过多台服务器来分担缓存的压力。


客户端担当分布式的master,通过客户端的分布函数(默认哈希取余的方式)来将缓存的key分散到不同服务器上


 


 
③ , memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除
 


写段代码说明: mem4.php
 


mem5.php 取出.
 


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


//memcache的细节讨论


生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:
1. 时间到
2. 重启memcached服务
3. 重启memcached服务所在的机器
4. delete / flush 销毁数据
5.
如何把session数据放入到memcached服务中.
步骤:
1. 修改php.ini的配置文件
如下:
;[sesson.save_handler 有user|files|memcache]
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"


测试一把,重启apache

测试ok 
<?php


//传统的代码
session_start();
$_SESSION['name']='天龙八部300';
$_SESSION['city']='beijing';
class Dog{
public $name;
}


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


//如果session数据放入mem,那他一定是以session_id为
//key值进行添加

//取出
$name=$_SESSION['name'];
echo "name=$name";
echo "sessionid=".session_id();




思考,如果管理员,不让我们修改 php.ini 文件,我们如何处理session入memcached这个功能, 我们通过一个函数可以去修改 php.ini 的配置.


代码:
<?php


ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:9999");


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


memcached vs session比较
memcached 主要的目的是提速 ,因此它是一种无状态的数据.即,数据不和用户绑定.
session数据是和绑定的,因此是一种有状态数据.


memached安全性
如何使用memcached 服务才是安全的.


在windows下通过启用防火墙来保护我们的memcached,原理图:
 


在linux 也可以使用防火墙.
setup 配置防火墙
iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT



 





















































原创粉丝点击