memcached

Memcache php

 

1、什么是memcached

1、基本概念:

1memcached是一个高性能的分布式的内存对象缓存系统,是为了解决大型网站的提速而设计的一个软件,主要缓存中间结果的数据。mysql

2Memcacheddanga的一个项目,最先是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被不少大型的网站采用。 官方网站: www.danga.com   memcached.orglinux

2、缓存原理

减小数据库访问,提升Web速度算法

 

 

实质:不用去请求读取mysql,减小mysql的并发量和读写量。sql

3、与mysql 进行比较

1)与mysql同样,是一个c/s架构的软件。数据库

2mysql里面的数据,是存储到磁盘里面的,memcache里面的数据是存储到内存里面的,一旦断电,服务器重启,则会丢失数据。apache

3)要使用mysql则先要建立数据库,再建立表,以及表结构。在memcache里面数据的存储是键值对。能够理解成两列的表, keyvalue缓存

name   小刚安全

age     12服务器

email    xiaogagn@sohu.com

 

2、安装使用

方式一:直接使用,无需安装,(在开发时推荐使用)

 

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下便可.

 

3、操做memcached服务器

1memcachedclient-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

 

 

 

4、php操做memcached

php做为客户端操做memcached

1、安装扩展

注意:

PHP链接memcached服务器,须要引入相应的扩展才行.windowphp-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();

 

 

 

 

效果以下;

 

3memcachedphp数据类型的支持

探讨php中有哪些数据类型能够添加到memcache中。

两大类:

标量和非标量

 

标量数据存储案例

 

 

效果以下;

 

 

黑窗口里面获取数据,

 

总结:标量则将其内容转换成字符串进行存储。

非标量数据存储;

 

 

获取数据

 

效果以下;

-

非标量:序列化后再存储到memcached服务器中,保存数据原有类型,获取数据时,再反序列化。

注意:资源类型不能被合理的序列化。

 

 

注意:序列化与反序列化的工做在,memcached客户端,setget方法中完成的,咱们无需手动序列化。

is_scalar()能够判断是不是标量类型。

什么是序列化?

就是在保存数据时,不但保存数据自己,还保存数据类型。

1)利于在网络间进行数据传输。

2)便于从新读取并恢复数据。

 

4、入门案例

想把一个sql语句的执行结果,给缓存到memcache里面。

 

要注意说明的,sql语句执行的结果数据要小于1MB

mecache 里面,键与值是有要求的,

键的长度要小于250字节。

数据值的大小要小于1MB

 

 

 

 

 

思路:

第一次访问时经过sql取出一些数据,把sql语句取出的数据添加到memcache缓存中。

第二次访问,先判断memcache里面有没有数据,有直接返回,若没有则从数据库里面取出。

5memcachetp框架里面使用

分两步:

1)初始化memcache

S(array(

‘type’=>’memcache’,

‘host’=>’ip地址’,

‘port’=>端口号

));

2)具体的操做

获取数据;

$data = S(key);

设置数据:

S(key,value,失效时间);

清空数据:

S(key,null)

添加数据操做

 

获取数据操做

 

删除数据操做

 

5、分布式缓存服务器的搭建

1、介绍

分布式部署:要架设多台memcache服务器支撑业务的发展,这样每台服务器承担的工做就会少一些,总体上memcache服务器性能就有所提升

如今以下有问题,

php须要思考哪一个key存储到哪一个服务器里边,php还须要思虑从哪一个服务器读取一个指定的key出来----算法。

一个分布式的memcached服务器集群,由两部分组成,

第一:多台memcached服务器 第二:分布式算法(内置的,咱们无需干预)

 

原理图:

 

 

实现原理

 

分布式算法由memcache客户端来实现,由php提供的memcached扩展来实现。算法都是内置的,无需咱们参与。

利用key,来肯定当前数据在哪台memcache服务器中进行存储。

2、搭建的步骤:

开启不一样的端口,来模拟两台memcache服务器。

开启第一台:

 

开启第二台

 

注意:使用$memcache->addServer()方法,能够添加多台memcached服务器的目的

 

具体的代码

 

 

取出数据的代码

 

 

6、session数据入memcache里面

1、原理图:

 

2、具体的操做

1)打开php.ini文件,配置session文件的存储方式

session.save_handler = files [user|memcache],

 

2session文件的存储路径,多个用逗号隔开。

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相同的。

 

7、memcache其余问题

1memcache适合于存储哪些数据

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在插入新数据时,若是空间不足时,采用删除旧缓存项策略,删除最不活跃的缓存项。

相关文章
相关标签/搜索