介绍:
memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,memcached就是在内存中维护一张巨大的hash表,通过自己的一套算法来维护数据的操作, 该表是在内存,表的结构是
key | value |
字串 | (字串,数值,数组,对象,布尔,二进制数据,null) |
原理说明:
安装并使用memcached
安装步骤
- 下载memcached软件
- 安装
进入cmd ,切换到 memcached.exe 文件所在目录
执行安装命令:memcached.exe –d install
- 启动memcached
第一种,可以到服务点击启动
第二种, 命令行
memcached.exe –m 200MB –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 , 去安装,在启动
- 你的exe 目录有中文,或特殊字符, 保证目录没有中文和特殊字符.
对memcached进行curd操作
看看telnet如何操作 (curd)
-
- 1. 登录到telnet连接到 memcached服务
telnet 127.0.0.1 11211
- 1. 登录到telnet连接到 memcached服务
如果你们不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:\windows\system32 即可
- 2. 增加
基本语法是:
add key名 0 存放时间(秒) 数据大小(字符)
举例:
add key1 0 30 5
- 3. 如何获取
基本语法是:
get key值
get key1
- 4. 修改set key名 0 存放时间 数据大小.举例:
set key1 0 40 5
☞ 如果key1不存在,则相当于增加新,如果存在,则相当有替换replace key名 存放时间 数据大小
replace key1 0 40 5
☞ 如果key1不存在,则失败,这个指令要求key必须存在. - 5. 删除
基本语法是
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
可以统一把数据清空.
status命令,查看memcache 统计信息
如何使用php程序操作我们的memcached服务
步骤,准备工作
- 把 dll 文件拷贝 php的ext 下
☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样 - 修改ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)
extension=php_memcache.dll
- 重新启动apache
- 我们写程序来完成curd操作.
在我们添加数据的时候
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在memcache中)
exprie 直接给的是秒数,则最大 30*3600*24(使用时间秒最长只能保存30天)
如果你希望保持时间超过30 time()+天数*3600*24 即可(使用Unix时间戳可以保存超过30天)
最后代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?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'; }*/ //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)){ 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. 资源类型放入. /* $con=mysql_connect("127.0.0.1","root","root"); if(!$con){ die('连接数据库失败'); } var_dump($con); echo "<br/>"; if($mem->set('key1',$con,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不存在'; } |
一个页面存入对象,另外一个页面取出对象时报错的解决办法
下面是另外一个页面取出数据时的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?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); |
什么时候使用serilize 什么时候使用json_encode [ajax配合]
使用PHP源码来操作memcached服务(socket.io编程)
如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.
下载 memcached-client.php (直接下载)(下载页面)文件,并关闭扩展.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php require_once 'memcached-client.php'; $mc = new memcached(array( 'servers' => array('127.0.0.1:11211'), //连接的memcacheip和端口 'debug' => false, //是否debug 'compress_threshold' => 10240, /*最大压缩*/ 'persistant' => true)); /*是否是持久连接*/ $mc->set('key1', array('some', 'array')); // $mc->replace('key', 'some random string'); $val = $mc->get('key1'); var_dump($val); //修改 $mc->replace('key1', "北京"); $val = $mc->get('key1'); var_dump($val); //删除 $mc->delete('key1'); $val = $mc->get('key1'); echo "删除后"; var_dump($val); |
Memcached 机制的深入了解
③ , memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除
总结:
- 1. mem服务的数据不是同步, 数据是分布的
- 2. 把什么数据放入到哪个memcached是由客户端的mem对象决定
- 3. 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销
memcache的细节讨论
生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:
- 1. 时间到
- 2. 重启memcached服务
- 3. 重启memcached服务所在的机器
- 4. delete / flush 销毁数据
如何把session数据放入到memcached服务中.
步骤:
- 1. 修改php.ini的配置文件
如下:
;[sesson.save_handler 有user|files|memcache]
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
- 2. 测试一把,重启apache
测试ok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?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(); |
ini_set 动态修改php.ini 的设置
如果管理员,不让我们修改 php.ini 文件,我们如何处理session入memcached这个功能, 我们通过ini_set
函数可以去修改 php.ini 的配置.
代码如下:
1 2 3 4 |
<?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
什么样的数据适合放入memcached中?
附录
memcache的深入了解(百度网盘(a7xf))