作者:烨竹
Memcache简介
Memcache是一个基于内存的键值对的缓存系统,具备读写速度比较高的特性,同时支持分布式存储
数据存储内存:Memcache将数据直接存储在内存中。因此内存中数据容易丢失(服务器重启会丢失数据)
键值对:例如PHP中数组 通过名称就可以找到对应的数据
缓存系统:临时存储数据的介质。最终在数据库中一定会存在对应的数据作为一个备份
分布式存储:每一个只存储一部分数据。对于memcache严格上自己本身是不支持分布式存储,是借助于第三方的扩展实现分布式存储
memcache安装
①创建memcache根目录
②拷贝memcache的安装包文件
③使用<u>超级管理员</u>打开cmd进入memcache目录
④以非服务器的方式安装memcache
此时为非服务的方式安装启动memcache目前cmd处于挂起状态不能正常操作
⑤以服务方式安装memcache
安装之后在自己计算机的服务中查看结果
⑥启动memcache服务
找到memcache的服务点击启动
或者使用cmd命令实现
memcache的相关参数
-p:指定memcache TCP协议的通信端口 默认为11211端口
-d :start/stop 用于启动或者关闭吗memcache
-d: install/uninstall:将memcache安装服务或者卸载服务
-u:指定用户 在Linux下使用
-m:指定memcache最大使用的内存 默认为64M
-c:指定memcache最大的并发数 默认为1024
memcache.exe -help
memcache常用的操作指令
memcache支持TCP协议的通信数据操作可以使用Telnet工具,所以这一些指令在Telnet工具中完成;Telnet工具用法:https://www.jianshu.com/p/6c80a53c0b66
1、set指令
作用:设置数据
语法:set 键名 0|1(是否压缩) 0(有效时间0代表不过期) 3(内容的长度)(注意写完长度需要回车)
键名:一个名称标识,此标识有要求最多250个字符。对于使用键名建议简短并且能表示含义 例如user_info_id_2
是否压缩:
0不压缩:直接将内容原生存储,此方式内存是的使用空间比较大(空间换时间)
1压缩:将内容按照规则压缩为更小然后存储,使用压缩可以节省内存空间但是相对于不压缩在操作上会略慢(时间换空间)
有效时间:0代表不过期一般永远有效。可以设置为一个具体秒数表示多少秒之后过期。在实际项目中一般对于此值都会设置一个过期的时间
内容长度:一定要按照具体的内容的字符数编写长度
值:写入到内存中的数据 最大只能为1M
①案例一
②案例二
Set一个不存在的key会创建该key 设置一个已经存在的会修改对应的值,即set的作用(添加与修改)
③案例三
此时表示age这个可用有效时间只有30秒,一旦30秒一到就不能读取数据(失效)
2、get指令
作用:读取数据
语法:get 键名称
3、add指令
作用:给key设置数据,只能针对一个不存在的key进行设置(add只能添加不能修改)
语法:语法同set
4、delete指令
作用:删除key
语法:delete 键名
5、incr指令
作用:设置自增长
语法 incr 键名 增加的数字
6、decr指令
作用:自减
语法:同incr
7、flush_all指令
作用:清空memcache中所有数据
语法:flush_all
此命令只能在测试中使用。
8、stats指令
作用:查看memcache状态
Memcache命中率=get_hits/cmd_get*100%
一般命中率在70-90之间勉强可以接受。
PHP操作memcache
注意:PHP对于memcache扩展有两套。另外一套为memcached扩展
1、php开启memcache扩展
①下载Windows下的PHP扩展(php7)
下载地址:https://github.com/keyesone66/php7_memcache.dell.git声明这是偷的别人的版本库里面的内容,不会做更新,本人只做收藏;来源:https://github.com/nono303/PHP7-memcache-dll
具体下载时需要注意 使用的编译器(VC14)、是否线程安装(ts/nts)、PHP的版本。所有信息都可以通过PHPinfo查看
②php.ini查看扩展目录
③将扩展文件拷贝到扩展目录下
④php.ini修改PHP的配置文件使用扩展
⑤重启再次查看phpinfo
⑥测试
memcache支持的数据类型
memcache对于PHP中的数据类型除了资源之外其他的都可以支持使用(由于资源变量经过序列化与反序列化之后结果变化),从本质上memcache支持的数据类型只有一种--字符串的数据类型;
下面具体详解:
基本数据类型:布尔,整型,字符串,浮点;支持所有;
复合数据类型:数组,对象;支持所有
特殊数据类型:NULL,资源;简单理解
使用telnet客户端查看数据
从上述结果可知,memcache中所存储的数组格式及对象格式的数据在memcache中都是经过序列化之后的字符串。从严格上说memcache只支持字符串格式的数据;对于PHP中的特殊数据类型只有空可以支持;
memcache管理工具
下载:$ git clone https://github.com/junstor/memadmin.git
memcache使用
三种使用场景:作为缓存系统,Session共享,作为分布式存储数据
作为缓存使用
1、读取数据时先读取缓存系统中的内容,有则直接使用否则在读取数据库获取原始数据然后在写入到缓存系统中
2、当数据发生变化修改原始数据之后需要将缓存中的内容进行更新
案例一:用户信息缓存
考虑当用户登录完成之后会经常使用用户的一起信息因此可以在用户登录完成之后将信息缓存到memcache中
①当用户登录完成设置数据
②使用缓存
后期可以在任何想要使用用户信息的地方直接读取memcache中的内容。例如member控制器中使用用户信息
案例二:商品关注功能实现
①添加关注
②查看关注的商品
分布式存储
1.memcache中分布式存储
每台memcache服务器中只保存一部分数据
2、Linux搭建memcache服务
https://www.jianshu.com/p/7f185ad792b4
实现memcache分布式存储
①关闭Linux下的防火墙
systemctl restart iptables.service
②创建代码实现分布式存储
<?php
$obj =new Memcache();
$obj -> addServer('127.0.0.1',11211);
$obj -> addServer('192.168.139.128',11211);
$obj->set('age1',1);
$obj->set('age2',2);
$obj->set('age3',3);
$obj->set('age4',4);
$obj->set('age5',5);
$obj->set('age6',6);
/*$obj -> connect('127.0.0.1',11211);
$res =$obj->set('keyname','keyvalue',0,0);
var_dump($res);*/
?>
③查看数据结果
192.168.116.135中的数据
关于memcache的分布式的存储是由PHP的扩展实现,会根据服务器已经具体的key的名称准确的定位具体数据存储的位置
Memcache分布式:可以扩充单memcache服务器存储上线并且也可以解决并发问题
memcache存储session
1.1、session的存储方式
1、session默认存储在文件中
2、Session存储到数据库中
3、使用memcache存储session信息
1.2、文件存储方式(默认方式)
优点:任何操作系统都可以支持此方式
缺点:速度相对比较慢。负载均衡项目下不能使用
1.3、数据库的存储方式
优点:速度相对文件提升并且解决了负载的问题
缺点:增加数据库的压力
1.4、memcache存储session
优点:提升速度并且解决负载问题 并且也减少了mysql的压力
1.5、实现memcache存储session
前置条件:需要有能够正常工作的memcache服务器
1.5.1、方式一修改配置文件
①修改PHP的配置文件
②重启apache
③编写代码测试
访问测试
查看memcache中的内容
1.5.2、方式二代码中实现
对于方式一由于是直接修改配置文件回导致服务器下所有的项目的session都会写入到memcache中。
①还原session的存储为默认的文件方式
!](https://upload-images.jianshu.io/upload_images/11994491-ac9caa2aca463781.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
②重启apache
③创建代码测试
查看结果