Memcache php
(1)memcached是一个高性能的分布式的内存对象缓存系统,是为了解决大型网站的提速而设计的一个软件,主要缓存中间结果的数据。mysql
(2)Memcached是danga的一个项目,最先是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被不少大型的网站采用。 官方网站: www.danga.com 和 memcached.orglinux
减小数据库访问,提升Web速度算法
实质:不用去请求读取mysql,减小mysql的并发量和读写量。sql
(1)与mysql同样,是一个c/s架构的软件。数据库
(2)mysql里面的数据,是存储到磁盘里面的,memcache里面的数据是存储到内存里面的,一旦断电,服务器重启,则会丢失数据。apache
(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服务器通讯的客户端程序。该客户端程序只要可链接上服务器,并向其发送简单的文本指令便可。
典型的,telnet远程登陆协议,
在cmd中 telnet IP地址 端口号
无需用户名和密码,没有认证机制。
注意:telnet客户端没法使用的解决方案:
解决方案以下:
(1) 打开控制面板,选择卸载程序
(2)选择‘启用或关闭window功能’
(3)在弹出的窗口中,选择telnet客户端,前面勾上对勾便可。
修改完毕后,再次使用telnet localhost 8888 链接,会弹出以下指令,则表示链接成功。
(1)添加数据,
语法:add key 是否压缩(0|1) 缓存时间 数据的长度
key :键的名称
是否压缩:0表示不压缩,1表示要压缩,压缩的目的让数据变小,存储更多的数据。
缓存时间:失效时间,表示过了该时间数据就失效。
数据的长度:单位是字节,
注意:在使用add添加数据时,若是该键已经存在,则添加失败,不会覆盖。
z
(2)修改数据
replace key 0|1 缓存时间 数据的长度
注意:若是键不存在,则修改失败。
(3)设置数据
set key 0|1 缓存时间 数据长度
注意:若是键已经存在,则是修改,若是键不存在,则是添加。
语法:delete key
flush_all 是删除全部的缓存项
incr 增长指定的值
语法:incr key number
decr 减小指定的值
好比有1000件商品,须要在60秒内抢购。
一开始就设置number的值为1000 ,当用户抢购时执行decr number ,若是执行后返回的值大于0则说明抢购成功,
stats
经过查看状态的参数,主要是计算命中率,
get_hits/cmd_get ====得出一个命中率,命中率越高越好,若是命中率比较低,则须要调整缓存项。
缓存周期有两种设置方式:
(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服务器,须要引入相应的扩展才行.在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手册
提供了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();
效果以下;
探讨php中有哪些数据类型能够添加到memcache中。
两大类:
标量和非标量
标量数据存储案例
效果以下;
黑窗口里面获取数据,
总结:标量则将其内容转换成字符串进行存储。
非标量数据存储;
获取数据
效果以下;
-
非标量:序列化后再存储到memcached服务器中,保存数据原有类型,获取数据时,再反序列化。
注意:资源类型不能被合理的序列化。
注意:序列化与反序列化的工做在,memcached客户端,set和get方法中完成的,咱们无需手动序列化。
is_scalar()能够判断是不是标量类型。
什么是序列化?
就是在保存数据时,不但保存数据自己,还保存数据类型。
(1)利于在网络间进行数据传输。
(2)便于从新读取并恢复数据。
想把一个sql语句的执行结果,给缓存到memcache里面。
要注意说明的,sql语句执行的结果数据要小于1MB。
在mecache 里面,键与值是有要求的,
键的长度要小于250字节。
数据值的大小要小于1MB。
思路:
第一次访问时经过sql取出一些数据,把sql语句取出的数据添加到memcache缓存中。
第二次访问,先判断memcache里面有没有数据,有直接返回,若没有则从数据库里面取出。
分两步:
(1)初始化memcache
S(array(
‘type’=>’memcache’,
‘host’=>’ip地址’,
‘port’=>端口号
));
(2)具体的操做
获取数据;
$data = S(key);
设置数据:
S(key,value,失效时间);
清空数据:
S(key,null)
添加数据操做
获取数据操做
删除数据操做
分布式部署:要架设多台memcache服务器支撑业务的发展,这样每台服务器承担的工做就会少一些,总体上memcache服务器性能就有所提升
如今以下有问题,
php须要思考哪一个key存储到哪一个服务器里边,php还须要思虑从哪一个服务器读取一个指定的key出来----算法。
一个分布式的memcached服务器集群,由两部分组成,
第一:多台memcached服务器 第二:分布式算法(内置的,咱们无需干预)
原理图:
实现原理
分布式算法由memcache客户端来实现,由php提供的memcached扩展来实现。算法都是内置的,无需咱们参与。
利用key,来肯定当前数据在哪台memcache服务器中进行存储。
开启不一样的端口,来模拟两台memcache服务器。
开启第一台:
开启第二台
注意:使用$memcache->addServer()方法,能够添加多台memcached服务器的目的
具体的代码
取出数据的代码
(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相同的。
(1)安全性不是很高的数据,丢失无所谓的数据,由于memcache服务器,一旦重启或关机,则会丢失全部的数据。
(2)查询比较频繁,改动周期比较长的数据,好比热点新闻,等等。
(3)一个键值,数据量不要很大,要小于1MB的数据。
memcache自己没有提供任何的认证机制。
若是须要请求链接限制,须要使用操做系统上的限制。
经过防火墙,iptables,selinux
常规的memcached服务器,是运行在内网中的,不是公网。
除此以外:
-l 表示当前memcache服务器,监听的哪一个ip地址的请求。在有多个有效ip的状况下,仅仅监听哪一个ip进来的请求。
-l后的参数仅仅能够设置为本身服务器存在的真实ip
在memcache里面数据过时后,不会自动删除,当get时,发现过时后,才删除该数据。
Lazy Expiration
memcached内部不会监视记录是否过时,而是在get时查看记录的时间戳,检查记录是否过
期。这种技术被称为lazy(惰性)expiration。
所以,memcached不会在过时监视上耗费CPU时间。
LRU,least Recently Used,最近最少使用原则。
memcache在插入新数据时,若是空间不足时,采用删除旧缓存项策略,删除最不活跃的缓存项。