memcached---------------------------------个人笔记
********************************************************Memcached缓存技术**************************************************************************
1:基本概念
最早是danga的一个项目,为Live Journal服务的,做成了一个软件。
介绍;Memcached是一种缓存技术,它可以将你的数据放入内存,从而通过内存访问提速。因为内存的速度是最快的(cpu的寄存器更快,但价格高昂),Mencached的主要目的就是提速。
2:三种方式访问
1)直接访问数据库(最慢的方案)
2)使用真静态(磁盘 学生成绩页面,稍快)
3)访问内存(Memcached服务维护了一张内存表(hahstable)(key;一般是子串,不能重复 value:可以放入字符串,数值,数组,对象,bool,二进制数据【图片视频】),最快)
//第一次我访问数据库,将该学员的成绩直接放入Memcached。
MYSQL里面也有一张内存表,目前技术停留在希望能够将数据全部放入mysql内存表。
3:安装并使用Mencached
软件:memcached-1.2.6-win32-bin.zip
安装步骤:
1)下载memcached软件
2)安装:将exe文件拷到apache并列的一个文件夹下
进入到cmd,切换到memcached.exe文件所在目录 cd 所在目录
mencached.exe -d install
3)启动memcached
第一种,可以到服务点击启动,就是任务管理器,点击启动
第二种,命令行启动,mencached.exe -d start|stop
如果你在win7下启动不成功,则可以使用如下shell方式:memcached.exe -p 端口号【因为它是shell方式,所以不要关闭控制台了】(不一定是11211,0-65535空闲的端口即可,端口号使用2个字节表示。有名端口:0-1024不要去占用)
apache 80
mysql 3306
ftp 21
ssh 22
oracle 1521
stmp 25等面试可能会被问到。
使用netstat -an如果看到11211端口在监听,说明启动成功
使用netstat -anb可以看到各个端口是在监听什么程序,还可以看到有哪些用户连接到我们的服务器
使用netstat -a可以看到连到服务器的ip与主机
使用netstat -a 192.168.1.100可以知道192.168.1.100对应的主机名
如果没有安装好,原因可能使:
1)如果你是windows7,win7对安全性要求高,所以必须以adminstartor身份安装。
你切换成adminstartor,去安装,再启动
2)你的memcached.exe目录有中文,或者特殊字符,保证路径没有中文与特殊字符即可。
4)准备研究如何对memcached进行curd操作(memcached服务)
php程序操作(memcache扩展操作,memcached扩展操作,直接使用socket编程来操作)用得最多
telnet工具
看看telnet如何操作(curd)
1)登录到telnet连接到memcached服务
如在cmd控制台里面:telnet 127.0.0.1 11211
2)增加
add key名 0 存放时间(s) 数据大小(字符)
add key1 0 30 5
hello
3)获取
get key值
get key1
4)修改
set key名 0 存放时间 数据大小 如果key名不存在,相当于增加一个新的,如果存在,相当于替换。
replace key名 存放时间 数据大小 如果key名不存在,则失败,这个指令要求key名必须存在。
5)删除
delete key名
6)其它指令
append append key100 0 40 2 gg 将两个字符gg添加到key100中(在后面加)
preend (在前面加)
flush_all 可以统一将数据清空
stats 统计表,大家可以去计算出命中率cmd_hits/cmd_get越高越好!!!!!
4:如何使用php程序操作我们的mencached服务crud?
步骤,准备工作:
1)将php_mencache.dll拷贝到php的ext下(不同版本的php对应着不同版本的.dll文件)
【为了让php可以操作,danga公司提供了.dll动态链接库php_mencache.dll(VC编译)】
2)加载配置,修改php.in文件,加载php_mencache.dll(该文件就是封装了一堆函数)
搜extension,加入;加载php_mencache.dll文件
extension=php_mencache.dll
3)重启apache
4)我们写程序来完成crud操作
men1.php
<?php
//创建一个men对象实例
$men=new Mencache();
if(!$men->connect("127.0.0.1".11211)){
die("连接失败");
}
//增加
//1增加一个字符串
$men->add(‘key1‘."beijing".MEMCACHE_COMPRESSED.60)){
echo "添加ok";
}
//添加数字
雷同
//添加数组
$arr=array("北京"."添加");
雷同
//4.添加对象
class Dog{
public $name;
public $age;
public function __construct($name.$age){
$this->name=$name;
$this->age=$age;
}
}
$dog1=new Dog(‘小狗‘.50);
if($men->set(‘key1‘.$dog1.MENCACHE_COMPRRESSED.60)){
echo ‘添加ok ‘:
}
//5添加null.bool
if($men->set(‘key1‘.null.MENCACHE_COMPRRESSED.60)){
echo ‘添加null ok ‘:
}
if($men->set(‘key1‘.false.MENCACHE_COMPRRESSED.60)){
echo ‘添加ok ‘:
}
//资源类型进入
$con=mysql_connect("127.0.0.1"."root"."root");
if(!$con){
die(‘连接数据库失败‘);
}
if($men->set(‘key1‘.$con.MENCACHE_COMPRESSED.60)){
echo "添加资源Ok";
}//资源实际上添加失败
//在添加数组时,根据需要,希望序列化再放入
serialize($arr) 如果根据需要也可以json_encode($arr) json_decode反序列化
//查询
$val=$men->get(‘key1‘);
echo ‘<br/>val=‘.$val;
//修改
$men->replace("key1".‘hello‘.MENCACHE_COMPRESSED.60)){
echo "replaca ok";
}else{
echo "不ok";
}
//删除
if($men->delete(‘key1‘)){
echo ‘key1删除‘;
}else{
echo ‘key1不存在‘;
}
//过期时间最大是30天,但可以通过时间戳延长。将过期时间写成time()+31*3600*24即可!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!尤其要注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
将expire设为0表示,永不过期(只要mencache不重启,就永远在mem中)
?>
men2.php
<?php
class Dog{
public $name;
public $age;
public function __construct($name.$age){
$this->name=$name;
$this->age=$age;
}
}
//这个文件区操作mencached服务
//创建一个men对象实例
$men=new Memcache;
if(!$men->connect("127.0.0.1".11211)){
die("连接失败");
}
//在另外的文件中取出对象时,有一个注意的地方,对于php5.2这个版本会提示错误,对5.3这个版本会提示incomplete信息,需要将Dog类黏贴过来。
$dog=$men->get(‘key1‘);
var_dump($dog);
?>
练习:请大家使用php程序Memcache.dll完成对mencache的增删改查。
五:直接用php源代码操作mencached服务
如果管理员不让我们去加载mencache.dll文件,我们可以直接通过原码操作(上网上找)
我们先关闭扩展:注销extension:php_memcache.dll
men3.php
粘贴拷贝过去
一般mencached-client.php!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!里面会有一段案例,黏贴到men3.php,稍加修改即可。
6:mencached机制的深入了解
1)基于c/s架构,协议简单
2)基于libevent的事件处理
3)内置内存存储方式,在数据爆满的情况下使用LRU算法删除。
4)基于客户端分布式的
写一段代码说明一下
men4.php
<?php
//我的电脑上右两个mencached服务:进入路径,再启用一个9999端口。即为两个mencached服务。
$mem=new Memcache(); //先在php.ini里面打开扩展,优先使用扩展,次选现成的函数
$mem->addServer(127.0.0.1‘.11211);
$mem->addServer(‘127.0.0.1‘.9999);
//这里注意,将key1放入到11211端口的memcache还是9999这个memcache就不需要我们去操心了,由$mem对象本身维护。(哈希,散列算法决定)
if($mem->add(‘key1‘.‘hello‘.MEMCACHE_COMPRESSED.200)){
echo ‘add ok‘;
}
?>
如何从多个memcache服务中取出你的key1值
<?php
$mem=new Memcache;
$mem->addServer(127.0.0.1‘.11211);
$mem->addServer(‘127.0.0.1‘.9999);
$val=$mem->get(‘key1‘);
echo ‘程序中取出分布的值=‘.$val;
?>
总结:
1:mem服务相互之间数据不是同步的,数据时分布存放的
2:将什么数据放入到那一个memcached是有客户端的mem对象决定的
3:当执行addServer时,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接那一个mem服务,因此当你大量加入服务器到连接池,没有多余的开销。
7:Memcached细节讨论
1)生命周期
从数据放入Memcache开始计时,直到时间到了,就销毁,如果时间为0,则表示永不过期。
mmemcache的数据被销毁的情况如下:
1:时间到
2:重启memcache服务
3:重启memcache服务所在的机器
4:delete/flush销毁数据
2)如何将session数据放入Memcached服务中
走一段代码
mem6.php
<?php
//传统的代码
session_start();
$_SESSION[‘name‘]=‘天龙八部‘;
$_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 "session=".session_id();
?>
步骤:
1)修改php.ini文件,搜session
关于session_save_handler=? files|user|memcache三种,换成第三种即可。
关于session.save_path="?" 写成"tcp://127.0.0.1:11211"
3:测试一把,重启apache
测试ok
思考一个问题:
如果管理员不让我们修改php.ini文件,我们如何处理session入memcached这个功能?
我们通过一个函数可以去动态地修改php.ini的配置信息!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!临时在本页面生效,不影响其它php页面,也不会去修改php.ini文件本身。
(将php.ini文件复原)
<?php
//加入如下代码即可!!!!!!!!!!!!!!!!!!!!!!!!!!
ini_set("session.save_handler"."memcache");
ini_set("session.save_path"."tcp://127.0.0.1:9999");
//传统的代码
session_start();
$_SESSION[‘name‘]=‘天龙八部‘;
$_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 "session=".session_id();
?>
php.ini文件里
safe_mode=off
safe_mode=on的区别在于安全模式给出的权限更小。
memcached与session的比较
memcached主要的目的是提速,因此它是一种无状态的数据,即:数据不与用户绑定。
session数据是与用户绑定的,因此它是一种有状态数据。
memcached安全性
如何使用memcached服务才是安全的?
在windows下,通过启用防火墙保护我们的memcached(放在内网)。
在linux下,也可以启用防火墙,
setup配置防火墙
iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT
适合放入memcached的数据:变化频繁,具有不稳定的数据,不需要实时入库的数据适合放入memcached,还有门户网站的新闻等,觉得页面静态化不能满足。
与memcached相关相似的技术:Redis(key/value数据库)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
本文出自 “枷罗博客” 博客,请务必保留此出处http://sun231013.blog.51cto.com/8558055/1576873
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。