memcache具体使用

  memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。很多大型网站都使用了memcached做缓存,下面我将做详细的介绍。

一、memcache简介及安装
1.简介:Memcache是高性能的分布式的高速内存对象缓存系统,基于Key-value型存储。将数据存储在内存里。和redis的不同的是memcache是缓存系统,而redis是数据库系统。
2.安装
(1)Windows下的安装:

  打开http://pan.baidu.com/s/1pKMJ64r ,下载至本地。打开该文件夹,如下图

  

   双击memcached文件夹,目录如下:

   

   

  然后运行memcached服务,有3种方式:

   A.直接双击memcached.exe。

   B.在cmd里通过命令的方式运行。

   C.将memchached添加到window服务里,先进入memcached的目录,然后使用命令memcached –d install。该种方式需要以管理员方式运行。

  重要的选项:

  -l  监听的网卡ip

  -p  tcp监听端口,默认为11211。当一台服务器有多个ip地址时,设置此选项,仅仅监听哪个ip地址

  -h  查看帮助

  -d install  安装服务

  -d uninstall  卸载服务

  -m  指定memcache最大的内存容量,以M为单位。默认64M

 

客户端使用:只要支持网络连接,并且能发送纯文本指令,就可以作为memcached的客户端。

例如:secureCRT,使用telnet协议,端口11211。

   

  

 (2)Linux下的安装:可参考下面的文章http://jingyan.baidu.com/article/636f38bb2b7c9dd6b84610cb.html

二、使用memcache
1. 设置和获取操作
设置指令:set key 压缩标识 有效期 长度
解读:
键:数字、字母、下划线组成,不要超过250个字节,实际开发时,建议使用前缀。
值:需要缓存的数据内容,是个字符串。
压缩标识:用于告知memcached服务器是否压缩后存储数据,以便节省磁盘空间。但是压缩和解压缩会消耗时间。0为不压缩,1为压缩。 
有效期:用于表示该key在什么时间失效。设置方式有两种,时间间隔和时间戳。单位是秒。区分时间间隔和时间戳的方式:大小,临界值30*24*3600=259200(30天)。
<=259200是时间间隔,>259200是时间戳。
长度:值的长度,以字节为单位。一个汉字如果以utf-8编码就是3个字节,如果以其他字符集编码,就是2个字节。
实际开发中,配合序列化和反序列化使用,单个key的值不要超过1M。
示例如下:

   

获取指令:get key

    

2. 其它的操作指令

incr key N  自增N                         decr  key N  自减N

add key 压缩标识 有效期 长度                  如果key已存在的话,则添加失败

replace key 压缩标识 有效期 长度                            如果key不存在的话,则替换失败

这两个功能和set一致,参数也一样,只是做了一些限制。

delete key  删除key                      flush_all  清空缓存


stats   查看memcached服务器的状态,如下图



将常用的数据,获取频繁的数据放在缓存中。

三、php操作memcached

php作为客户端,需要开启php_memcache扩展。

将上面下载的php_memcache.dll扩展文件,放在 \wamp\bin\php\php5.4.16\ext 目录下,这个目录是php的扩展文件的目录。然后修改配置文件,将该扩展开启。最后重启apache服务。

1.代码测试:

//实例化一个memcache类
$memcache=new Memcache();
//主机和端口
$host="192.168.1.107";
$port="11211";
//连接服务器
$memcache->connect($host,$port);
//设置,常用的有以下5种
/*
$memcache->set(key,value,压缩,有效期);  长度会自己计算,不用写
$memcache->add(key,value,压缩,有效期);
$memcache->replace(key,value,压缩,有效期);
$memcache->increment(key,N);
$memcache->decrement(key,N);
*/
$memcache->set('name','zls',0,300);
//获取
echo $memcache->get('name');
//删除
$memcache->delete('name');
$memcache->flush(); //清空
//关闭连接
$memcache->close();
  运行效果:输出zls。


  2.关于数据存储的问题

//实例化一个memcache类
$memcache=new Memcache();
//主机和端口
$host="192.168.1.107";
$port="11211";
//连接服务器
$memcache->connect($host,$port);
//插入4种类型的数据
/*
$memcache->set("int",42,0,3600);
$memcache->set("float",42.435,0,3600);
$memcache->set("boolean",false,0,3600);
$memcache->set("string","php",3600);
*/
var_dump($memcache->get("int"));
var_dump($memcache->get("float"));
var_dump($memcache->get("boolean"));
var_dump($memcache->get("string"));
//关闭连接
$memcache->close();

 运行效果如下图:

 

发现输出来的都是字符串,明明我们存的是整型、浮点型、布尔型数据啊。原来memcached存储的时候会把这些标量类型的数据都转换为字符串类型了。但这不影响使用,因为实际开发时我们可以用php的类型转换函数将它们还原成指定的数据类型。

非标量类型(数组,对象)会序列化存储,能存储原来的数据。

函数is_scalar()可以判断是不是标量类型。

四、分布式memcached服务器

分布式,多台memcached服务器,形成memcached集群,目的是提升memcache硬件资源数量。Memcached分布是互不通信的分布式。

分布式算法由客户端来实现,对php来说就是php的memcache扩展。Memcache对象有addServer方法来添加memcached服务器,形成集群。

  

  

集群用php操作时不需要使用connect方法连,而是用addServer方法。之后的操作和没有集群时一样,不需要指定哪台服务器。

 测试代码:


$memcache = new Memcache();

# 添加服务器到集群
$host = '192.168.42.40';
$port = '11211';
$memcache->addServer($host, $port);

$host = '127.0.0.1';
$port = '11212';
$memcache->addServer($host, $port);

$host = '192.168.42.75';
$port = '11211';
$memcache->addServer($host, $port);

# 常规操作
$result = $memcache->set('kang_title', 'PHP-34', 0, time()+3600);
var_dump($result);

// $item = $memcache->get('kang_title');
// var_dump($item);


$memcache->close();

分布式算法:除模取余法,通过crc32算法将key转换成一个数字,再对服务器的数量取余,就可以得到它要存储在哪台服务器上。

   


  

 五、缓存失效问题

1.缓存过期:memcached在处理过期的缓存项时,采用懒惰模式的处理方法。即缓存项过期时,不会立即删除,直到对该缓存项执行了get操作,才会删除过期的缓存项。

2.缓存空间已满:当缓存空间已满时,新缓存项插入时,会将旧的缓存项删除,就会出现get不到旧缓存项的问题。采用删除最近最少使用(使用频率低)的缓存项。(LRU策略)


六、session入memcached

Session可以存储在内存里更方便,提升性能。使用前需要先开启memcache扩展。然后使用memcahce扩展提供的session处理器(session.save_handler)即可实现session入memcached

 每个会话数据,就是一个key/value型memcache值,key就是当前的sesseion-id,而值就是当前会话被序列化好的数据。

  测试代码如下:

//修改session存储处理器为memcache
ini_set("session.save_handler","memcache");
//修改session的保存路径为memcached
ini_set("session.save_path","tcp://127.0.0.1:11211");
  //ini_set("session.save_path","tcp://127.0.0.1:11211;tcp://host2:port2");  多台服务器
session_start();
$_SESSION['name']="zls";
echo session_id();

  输出的session-id为:a16u5or9fq9jmmrm8r8pa5db37

 然后我们再通过这个session-id作为key去获取值。

//实例化一个memcache类
$memcache=new Memcache();

//主机和端口
$host="192.168.1.107";
$port="11211";

//连接服务器
$memcache->connect($host,$port);


var_dump($memcache->get("a16u5or9fq9jmmrm8r8pa5db37"));
//关闭连接
$memcache->close();

  结果如下,显然是序列化后的值:

 string 'name|s:3:"zls";' (length=15)



   在分布式服务器的情况下,多台服务器很难做到会话共享,因此需要sesssion入库。即增加一台session服务器,专门用来session入库或者session入memcached。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值