memcached

Memcache 

 

一、什么是memcached

1、基本概念:

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

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

2、缓存原理

减少数据库访问,提高Web速度

 

 

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

3、与mysql 进行比较

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

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

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

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服务器

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

 

 

 

四、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)

添加数据操作

 

获取数据操作

 

删除数据操作

 

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

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],

 

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

 

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

 

posted on 2017-07-15 14:38  zxyPhp  阅读(291)  评论(0编辑  收藏  举报