一.memcache概述
1.介绍
memcache一款高性能的分布式的内存缓存系统,他是将我们的数据以键值对的形式存放在内存,从而可以提高数据的访问速度,从而提高网站的整体的响应速度.
原理图:
介质访问速度:数据库<文件<内存
memcache的使用场景:
因为memcache是将数据存放在内存中,不可将数据同步到硬盘中(不可以持久化),电脑一旦关机,内存中的数据就会丢失,所以不要存放重要的数据.
一般数据变化频繁,但是不重要的数据我们可以使用memcache缓存起来
2.memcache软件
memcache是一个c/s结构的软件,服务端可以在window和linux中运行,客户端连接我们可以使用php,putty,secureCRT,telnet工具去操作memcache中的数据
3.memcache和mysql的一个区别
①存储数据的介质不同
mysql:是将数据存放在文件中的,操作它的时候需要磁盘的i/o开销
memcache:是将数据存放在内存中的,访问速度更加快
②存储数据的形式不同
mysql:是将数据存放在有行有列的二维表中
memcache:是将数据以键值(k-v)对的形式存储在内存中的
RDBMS:关系型数据库.mysql,sqlserver,oracle
nosql( not only sql):泛指非关系型数据库,产品有memcache,redis,mongdb等
二.memcache服务软件的的安装
1.window中的memcache服务安装
第一步:把课件中的memcached.exe服务端软件复制到自己的目录中
第二步:去memcached.exe的目录去安装启动memcache服务
-p:memcache监听的端口号,默认是11211
-l:memcache服务器的ip地址
-u:使用哪个用户启动memcache服务(在linux中使用)
-m:使用的内存大小,默认是64M
-d install:安装服务
-d uninstall:卸载服务
-d start|stop|restart :开启|关闭|重启memcache服务
安装memcache服务(需要以管理员的身份去安装memcache服务):
如果安装memcache服务的时候报以下的错:
解决办法:
1-1:连接memcache服务器
①使用putty连接:
②使用telnet去连接memcache服务
使用telnet连接memcache服务器:
出现以下界面代表成功:
③使用secure-CRT工具连接memcache
2.linux中安装memcache服务
第一步:把memcache所需要的源码包上传到linux中的目录中
第二步:安装memcache所依赖的事件库libevent
a:解压并进入解压后的目录
b:执行./configure指令,指定安装的路径
c:编译和安装
最后检查有没有所安装指定的目录:
第三步:安装memcache服务端的软件
a:解压并进入解压后的目录
b:执行./configure指令 ,指定安装路径和libevent的安装路径
c:编译和安装
检查有没有安装成功:
第四步:安装好后启动memcache服务
第五步:连接linux中memcache服务
三.memcache常用的一些操作指令
1.命令清单
set name 0 0 3 :增加或者修改一个值
set:指令
键名:name
是否压缩:0-不压缩,1-压缩 (时间换空间还是空间换时间)
有效期:0代表永不过期,10为有效期为10秒
get name:获取一个键名为name的值
add name 0 0 3 :只能增加一个值
delete name:删除键名为name的值
replace name 0 0 3:替换键名为name的值
flush_all:清空memcache服务器所有的数据(此命令慎用)
incr age 整数值:自增
decr age 整数值:递减
stats:查看memcache服务器的状态
2.php操作memcache中的数据
①安装window中php操作memcache的扩展库
需要重启apache服务器:
建立一php文件,写个phpinfo()函数测试,查看有没有memcache扩展:
2-1:php操作memcache中的数据
①使用php提供的内置类库去操作memcache中的数据
②具体用法
打印的结果:
总结:memcache可以存储标量和复合数据类型,还有null类型,只有资源类型的数据不可以存储
memcache存储数组的时候底层已经把我们序列化存储了,取出来的时候,直接去即可.
session存储数组也是不需要序列化的.
但是cookie存储数组是需要序列化的,用的时候需要反序列化
php序列化函数:serialize(),php反序列化函数:unserialize()
四.在lamp环境中安装php的memcache扩展
1.在lamp中安装php的扩展步骤(面试题)
①需要把php对应的源码包拉到linux中
②解压进入解压后的目录
③在解压的目录,执行php的安装目录中的phpize指令加载php的其他扩展程序,执行后会在解压的目录生成一个configure等文件
④在解压目录执行configure 并且指定php的php-config文件路径
⑤编译和安装 ,执行完毕后会生成一个***.so的动态库文件
⑥在php配置文件php.ini中指定***.so的动态库文件的路径
⑦重启apache服务器,写个phpinfo的函数进行测试有没有对应的扩展出现
2.安装步骤
①需要把php对应的源码包拉到linux中
②解压进入解压后的目录
③在解压的目录,执行php的安装目录中的phpize指令加载php的其他扩展程序,执行后会在解压的目录生成一个configure等文件
④在解压目录执行configure 并且指定php的php-config文件路径
⑤编译和安装 ,执行完毕后会生成一个***.so的动态库文件
安装后生成一个目录,并且这个目录中有个扩展的memcache动态库:
⑥在php配置文件php.ini中指定***.so的动态库文件的路径
⑦重启apache服务器,写个phpinfo的函数进行测试有没有对应的扩展出现
五.memcache的分布式
1.介绍
因为单台的memcache服务器能力有限,我们可以设置多个memcache服务器组成一个分布式,这样抗压能力就更大.
memcache分布式中各台memcache服务器是不可以互相通信,我们可以通过客户端其实现通信,客户端可以使用php一个类库中addServer()函数可以实现分布式存储数据,
php的memcache类库addServer()已经实现了分布式的算法,直接连接多台服务器即可:
2.php实现memcache分布式
3.雪崩现象
雪崩现象主要是出现在memcache分布式中,就是指当某一台服务器宕机(死机),那么之前请求这台服务器上面的所有的请求瞬间请求mysql数据库,瞬间mysql压力非常大.我们把这种现象称之为雪崩现象
六.memcache的应用场景
1.使用memcache缓存oa系统的公文列表的数据
第一步:在配置文件中增加memcache的缓存类型,并且指定memcache服务器的ip地址和端口号
第二步:使用TP框架中的S()方法实现数据的缓存
注意一点:如果用户对数据进行编辑和删除,我们需要对缓存中的数据进行情况,S()清空
$(‘lists’,null)
2.将session存入nosql中
2-1.存储session的介质
①session存储文件中(默认模式)
②session入库(存入mysql中)
建议不要入mysql数据库,因为每次操作session信息的时候都需要操作mysql数据库,
③session入nosql(memcache,redis(存储数据的类型更加丰富))中
存入nosql是最好的方案,也经得住大并发的情况
面试题:session共享的问题
答:session入nosql中,或者入库
2-2.具体操作
需要修改session默认的存储机制,因为session信息默认是存放在文件中的,我们需要修改它相关的配置参数:
七.memcache的一些特性
1.memcache的惰性失效机制
当memcache中一个值失效了,并不会从memcache中立刻删除,只有发送get执行才会删除,
我们把这种机制称之为惰性失效机制
2.LRU删除机制
LRU:Least ReCent Used(最近最少使用,永久数据也会被剔出)
问题:如果memcache内存满了,在继续存入一个值,可以存进去吗?
答:可以,只要最近最少使用的就会被踢出去,永久数据也会被剔出.
八.memcache的注意事项
1.键名不要超过250字节
2.存储的值不要超过2MB,存储一般的文章内容足够
3.有效期不可以超过30天,超过30天有效期会从1970年开始算起,这时候早就过去了
解决超过有效期超过30天办法:加时间戳即可 time()+31*3600*24