您的位置:首页 > 数据库 > Memcache

memcached在widdows环境下的详细剖析

2016-10-10 20:43 190 查看
更多内容清访问www.phptuku.com

一.memcached 基本概念

Memcached是一个高性能的分布式的内存对象缓存系统,用于减少数据库负载,提升性能。包括服务端和客户端。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,通过自己的算法开维护数据的操作。它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。



二.memcached的安装(Windows下的安装)

下载memcached软件,http://memcached.org/download

将memcached软件拷贝到某个目录,最好放在php开发环境目录下,与apache,php,mysql同级目录,便于管理

安装 memcached –d install [卸载使用 memcached -d uninstall

启动 memcached 服务

(1)直接通过界面启动该服务

(2)在控制台下启动 memcached –d start

(3)查看memcached 服务是否启动成功,可使用命令: memcached -h ,出现如下表示成功



参数说明:

-p 监听的端口

-l 连接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install 安装memcached服务

-d uninstall 卸载memcached服务

-u 以的身份运行 (仅在以root运行的时候有效)

-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时连接数,默认是1024

-f 块大小增长因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-h 显示帮助

三.telnet操作memcached(CURD)

登录到telnet,连接到memcached服务,命令窗口下输入telnet 127.0.0.1 11211,



回车出现如下,输入任何东西都不会显现出来,看不到任何东西,这是因为Win7 中将telnet 回显功能关闭了



对当前框同时按下 “CTRL ”和“]” 健,将进入如下页面:



输入 “set localecho”,开启回显telnet回显功能



按下Enter键,进入telnet 交互界面,这时候用户可以看到自己的输入了



telnet写入memcache命令格式

<command name> <key> <flags> <exptime> <bytes>  <data block>


参数说明:

command name:set/add/replace

key:查找关键字

flags:整型参数,客户机使用它存储关于键值对的额外信息

exptime:该数据的存活时间(以秒为单位,0 表示永远)

bytes:存储字节数

data block:存储的数据块(可直接理解为key-value结构中的value)

三.PHP操作memcached(CURD)

php操作memcached有以下三种形式:


memcache扩展

memcached扩展

Sokket套接字操作,memcached-client.php

1.如何使用php操作memcached服务

(1)把php_memcache.dll文件拷贝到php的ext下

注意:不同版本的php 所使用的 php_memcache.dll 的版本不一样

(2)修改php.ono配置,加载php_memcache.dll文件,extension=php_memcache.dll

(3)重新启动apache

(4)写代码完成curd操作

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


2.如何使用PHP源码来操作memcached服务

如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.关闭扩展.

<?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);


3.memcached机制深入了解

①基于c/s架构 ,协议简单

c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器。

memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据

②基于libevent的事件处理

libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统: Windows/Linux/BSD/Solaris 等操作系统的的事件处理。

Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。

③内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

④基于客户端的分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。



<?php

//我的电脑上有两个memcahced服务.

$mem=new Memcache;

$mem->addServer('127.0.0.1',11211);
$mem->addServer('127.0.0.1',9999);
$mem->addServer('127.0.0.1',9998);
$mem->addServer('127.0.0.1',9997);
$mem->addServer('127.0.0.1',9996);

//这里注意,把key1,放入到 11211端口的mem还是
//9999 端口的mem就不要我们操心,有$mem对象本身维护.
if($mem->set('key1','hello',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key2','hello2',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key3','hello3',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}


<?php

//如何从多个mem中取出你的key?

$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服务,因此当你大量加入服务器到连接池,没有多余开销

4.memcached细节

① 生命周期

从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.

memcache的数据被销毁的情况如下:

时间到

重启memcached服务

重启memcached服务所在的机器

delete / flush 销毁数据

② 如何把session数据放入到memcached服务中.

步骤:

修改php.ini的配置文件

如下:

;[sesson.save_handler 有user|files|memcache]

session.save_handler = memcache

session.save_path = “tcp://127.0.0.1:11211”

③ 测试一把,重启apache

测试ok
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息