Memcache
一、什么是memcached
1、基本概念:
(1)memcached是一个高性能的分布式的内存对象缓存系统,是为了解决大型网站的提速而设计的一个软件,主要缓存中间结果的数据。
(2)Memcached是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。 官方网站: www.danga.com 和 memcached.org
2、缓存原理
减少数据库访问,提高Web速度
实质:不用去请求读取mysql,减少mysql的并发量和读写量。
3、与mysql 进行比较
(1)与mysql一样,是一个c/s架构的软件。
(2)mysql里面的数据,是存储到磁盘里面的,memcache里面的数据是存储到内存里面的,一旦断电,服务器重启,则会丢失数据。
(3)要使用mysql则先要创建数据库,再创建表,以及表结构。在memcache里面数据的存储是键值对。可以理解成两列的表, key与value
name 小刚
age 12
email xiaogagn@sohu.com
二、安装使用
方式一:直接使用,无需安装,(在开发时推荐使用)
(1)下载软件,把软件拷贝到指定位置,一般和其他的安装软件(比如apache等)在同级目录下面,主要是便于管理。
(2)以cmd的方式,运行memcache
进入到memcached.exe文件所在的目录,
帮助命令:Memcached –h
开始cmd方式,运行memcache软件。、
启动后,该窗口不要关闭,一旦关闭,则服务就停止了。
方式二:把 memcahce安装成window的一个服务,(在生产环境中推荐使用)
通过查看memcached 的帮助。
注意:在把 memcache安装成window的一个服务时,要以管理员的方式启动cmd.
查看服务是否安装成功:
安装可能失败的原因:
(1) 如果你是用win7,win8系统,他对安全性要求高,因此,需要大家使用管理员的身份来安装和启动. 具体是 程序开始===>所有程序==》附件==》cmd(单击右键,选择以管理员的身份来执行)
(2)存放memcached.exe 目录不要有中文或者特殊字符
(3)安装成功,但是启动会报告一个错误信息,提示缺少xx.dll ,你可以从别的机器拷贝该dll文件,然后放入到system32下即可.
三、操作memcached服务器
1、memcached是client-server (客户端-服务器)
此时需要一个可以与memcached服务器通信的客户端程序。该客户端程序只要可连接上服务器,并向其发送简单的文本指令即可。
典型的,telnet远程登录协议,
在cmd中 telnet IP地址 端口号
无需用户名和密码,没有认证机制。
注意:telnet客户端无法使用的解决方案:
解决方案如下:
(1) 打开控制面板,选择卸载程序
(2)选择‘启用或关闭window功能’
(3)在弹出的窗口中,选择telnet客户端,前面勾上对勾即可。
修改完毕后,再次使用telnet localhost 8888 连接,会弹出如下指令,则表示连接成功。
2、设置数据
(1)添加数据,
语法:add key 是否压缩(0|1) 缓存时间 数据的长度
key :键的名称
是否压缩:0表示不压缩,1表示要压缩,压缩的目的让数据变小,存储更多的数据。
缓存时间:失效时间,表示过了该时间数据就失效。
数据的长度:单位是字节,
注意:在使用add添加数据时,如果该键已经存在,则添加失败,不会覆盖。
z
(2)修改数据
replace key 0|1 缓存时间 数据的长度
注意:如果键不存在,则修改失败。
(3)设置数据
set key 0|1 缓存时间 数据长度
注意:如果键已经存在,则是修改,如果键不存在,则是添加。
3、删除数据
语法:delete key
flush_all 是删除所有的缓存项
4、其他命令
incr 增加指定的值
语法:incr key number
decr 减少指定的值
比如有1000件商品,需要在60秒内抢购。
一开始就设置number的值为1000 ,当用户抢购时执行decr number ,如果执行后返回的值大于0则说明抢购成功,
5、状态命令:
stats
通过查看状态的参数,主要是计算命中率,
get_hits/cmd_get ====得出一个命中率,命中率越高越好,如果命中率比较低,则需要调整缓存项。
6、缓存周期的问题
缓存周期有两种设置方式:
(1)时间间隔(秒数)
(2)到期的时间戳,必须大于当前的时间戳才有效。
思考:时间间隔和到期的时间戳都是整数,如何区分是时间戳还是时间间隔。
如果使用时间间隔,则不能超过 2592000秒(30天)。
如果缓存时间小于2592000秒则是时间间隔,如果大于此值,小于当前的时间戳,则设置无效。
案例1:比如我们想要设置缓存时间为10天,如何设置
设置方式有两种:
(1)时间间隔10*24*3600秒
(2)到期的时间戳:time()+10*24*3600
案例2:比如我们想要设置缓存时间为40天,如何设置,
只能使用到期的时间戳
time()+40*24*3600
注意:如果此值设置为0表明此数据永不过期
比如如下测试,设置一个时间间隔大于2592000;
四、php操作memcached
php作为客户端操作memcached
1、安装扩展
注意:
PHP连接memcached服务器,需要引入相应的扩展才行.在window下php-memcache.dll
注意:在window下找相应的dll时要非常小心.
需要考虑:
l php版本
l ts or nts
l vc6 or vc9
可以通过phpinfo函数来查看PHP的环境,是ts的还是nts,是vc几编译的。
(1)把memcached的扩展拷贝到的ext目录下。
要注意:php的版本不同,则使用的扩展不同。
(2)打开php.ini文件引入扩展
(3)测试查看,使用phpinfo函数
该扩展提供的一套oop的程序,参考php手册
2、入门应用,实例化和连接服务器
提供了OOP语法,管理memcached服务器:
连接memcache
$mem = new Memcache();
$mem->connect(‘ip地址’,’端口’);
设置:
$memcache->add(键, 值, 是否压缩, 有效期);//如果键已经存在,则添加失败,不会覆盖掉。
$memcache->replace(键, 值, 是否压缩, 有效期);
$memcache->set(键, 值, 是否压缩, 有效期);
$memcache->increment(键,步长);
$memcache->decrement(键,步长);
获取:
$memcache->get(key);
删除:
$memcache->delete(key);删除某个键
$memcache->flush(void);删除全部键
关闭连接:
$memcache->close();
效果如下;
3、memcached对php数据类型的支持
探讨php中有哪些数据类型可以添加到memcache中。
两大类:
标量和非标量
标量数据存储案例
效果如下;
黑窗口里面获取数据,
总结:标量则将其内容转换成字符串进行存储。
非标量数据存储;
获取数据
效果如下;
-
非标量:序列化后再存储到memcached服务器中,保存数据原有类型,获取数据时,再反序列化。
注意:资源类型不能被合理的序列化。
注意:序列化与反序列化的工作在,memcached客户端,set和get方法中完成的,我们无需手动序列化。
is_scalar()可以判断是否是标量类型。
什么是序列化?
就是在保存数据时,不但保存数据本身,还保存数据类型。
(1)利于在网络间进行数据传输。
(2)便于重新读取并恢复数据。
4、入门案例
想把一个sql语句的执行结果,给缓存到memcache里面。
要注意说明的,sql语句执行的结果数据要小于1MB。
在mecache 里面,键与值是有要求的,
键的长度要小于250字节。
数据值的大小要小于1MB。
思路:
第一次访问时通过sql取出一些数据,把sql语句取出的数据添加到memcache缓存中。
第二次访问,先判断memcache里面有没有数据,有直接返回,若没有则从数据库里面取出。
5、memcache在tp框架里面使用
分两步:
(1)初始化memcache
S(array(
‘type’=>’memcache’,
‘host’=>’ip地址’,
‘port’=>端口号
));
(2)具体的操作
获取数据;
$data = S(key);
设置数据:
S(key,value,失效时间);
清空数据:
S(key,null)
添加数据操作
获取数据操作
删除数据操作
五、“分布式”缓存服务器的搭建
1、介绍
分布式部署:要架设多台memcache服务器支撑业务的发展,这样每台服务器承担的工作就会少一些,整体上memcache服务器性能就有所提高
现在如下有问题,
php需要思考哪个key存储到哪个服务器里边,php还需要思虑从哪个服务器读取一个指定的key出来----算法。
一个分布式的memcached服务器集群,由两部分组成,
第一:多台memcached服务器 第二:分布式算法(内置的,我们无需干预)
原理图:
实现原理
分布式算法由memcache客户端来实现,由php提供的memcached扩展来实现。算法都是内置的,无需我们参与。
利用key,来确定当前数据在哪台memcache服务器中进行存储。
2、搭建的步骤:
开启不同的端口,来模拟两台memcache服务器。
开启第一台:
开启第二台
注意:使用$memcache->addServer()方法,可以添加多台memcached服务器的目的
具体的代码
取出数据的代码
六、session数据入memcache里面
1、原理图:
2、具体的操作
(1)打开php.ini文件,配置session文件的存储方式
session.save_handler = files [user|memcache],
(2)session文件的存储路径,多个用逗号隔开。
session.save_path,tcp://127.0.0.1:11211
配置完要重启apache
(3)具体的代码完成,常规使用session即可。
注意:可以使用ini_set()函数完成,在当前页面有效:
ini_set(‘session.save_handler’,’memcache’)
ini_set(‘session.save_path’,’tcp://127.0.0.1:11211’)
设置数据
注意:使用session的方式和以前是一样的。
取出的数据
session信息存储到memcache里面是以sessionid为键的,失效时间与session相同的。
七、memcache其他问题
1、memcache适合于存储哪些数据
(1)安全性不是很高的数据,丢失无所谓的数据,因为memcache服务器,一旦重启或关机,则会丢失所有的数据。
(2)查询比较频繁,改动周期比较长的数据,比如热点新闻,等等。
(3)一个键值,数据量不要很大,要小于1MB的数据。
2、安全性完整性问题
memcache本身没有提供任何的认证机制。
如果需要请求连接限制,需要使用操作系统上的限制。
通过防火墙,iptables,selinux
常规的memcached服务器,是运行在内网中的,不是公网。
除此之外:
-l 表示当前memcache服务器,监听的哪个ip地址的请求。在有多个有效ip的情况下,仅仅监听哪个ip进来的请求。
-l后的参数仅仅可以设置为自己服务器存在的真实ip
3、缓存失效问题
在memcache里面数据过期后,不会自动删除,当get时,发现过期后,才删除该数据。
Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过
期。这种技术被称为lazy(惰性)expiration。
因此,memcached不会在过期监视上耗费CPU时间。
4、缓存已满,删除旧数据
LRU,least Recently Used,最近最少使用原则。
memcache在插入新数据时,如果空间不足时,采用删除旧缓存项策略,删除最不活跃的缓存项。