memcache

一.系统核心优化
思路:以小博大、利用最小的资源换取最大的回报
memcache、mysql优化、静态化技术
优化的是什么地方?
memcache_第1张图片
二.Memcache
memory cache 内存缓存技术
memcache_第2张图片
Memcache或Redis是中间介质,可以帮助我们通过php语言实现对内存的操作
1.memcache和redis的区别、联系
区别:
前者:
每个key的数据最大是1M
对各种技术支持比较全面,session可以存储memcache中,各种框架(例如thinkphp)对memcache支持的比较好
比较老牌、传统的内存缓存技术
适合存储简单、实用的数据
数据类型只有String
没有持久化
后者:
每个key的数据最大是1G
对各种技术支持没有memcache更好。
新兴的内存缓存技术
适合做集合计算(list/set/sortset)
数据类型较丰富(String/list/Set/Sort set/hash)
有持久化
联系:
数据存储在内存当中,数据模型都是key-value

两种内存缓存技术都要掌握,大家有各自擅长的地方
memcache:对session支持,各种框架支持
redis:集合计算

2 安装使用memcache
解压:
memcache_第3张图片
解压后生成文件(服务器端执行文件):
memcache_第4张图片
考虑(服务器端)执行文件到H:目录:
memcache_第5张图片
2.1 开启memcache服务
前台开启服务(不推荐):
memcache_第6张图片
Ctrl+C结束掉

开启服务可以设置的参数:
memcache_第7张图片
通过设置参数开启memcache服务:(这是前台运行,用ctrl+c停止掉)
memcache_第8张图片
之后可以在任务里边看到memcache:
memcache_第9张图片
2.2 设置开机启动项服务
sc create 名称 svn相关参数(这是SVN启动后台服务的指令)
memcache_第10张图片
现在没有memcache服务:
memcache_第11张图片
开机启动项服务有安装成功:
memcache_第12张图片
如果想要详细设置,那么就如下图
在这里插入图片描述

通过-d start开启服务:
memcache_第13张图片
停止和卸载服务:
memcache_第14张图片
3.给php开启memcache扩展
给php.ini设置对应的扩展(没有就添加一行):
memcache_第15张图片
给php扩展目录拷贝对应的扩展文件:
memcache_第16张图片
之后重启apache

php开启memcache扩展成功:
memcache_第17张图片
4. php操作memcache
在php中memcache体现为“类Memcache”
具体使用:实例化对象,对象调用成员方法即可。

具体操作:
设置
     $obj -> set(key,value,是否有压缩0/1,有效期);
是否压缩:
     不考虑速度,计较内存空间,压缩
     计较速度,不计较内存空间,不压缩
有效期:
     单位:秒
获取
     $obj -> get(key);
删除
     $obj -> delete(key);

连接memcache服务器成功:
memcache_第18张图片
给memcache设置一个week的key变量:
memcache_第19张图片
把刚才设置好的key给读取出来:
memcache_第20张图片
4.1 key的命名
key的名字可以有许多字符组成,长度不能超过250字节。
空格不能作为名字的组成内容。
(utf-8字符集的一个汉字是3个字节)
在这里插入图片描述
memcache_第21张图片
4.2 有效期
为0即不失效。
两种方式:
① 时间戳:1970-1-1号到目前的秒数
② 时间差:时间数字,从目前往后延伸的时间长度
时间差的值大到一定程度与时间戳的值可以保持一致
(限制:时间差最多不能多于30天,否则其为时间戳)
两种方式设置key的有效期:
memcache_第22张图片
获取有效期内的key信息:
memcache_第23张图片
有效期的限制(变形):
memcache_第24张图片
前者的信息可以正常获取,后者已经早早过期
memcache_第25张图片
一个key的有效期为60天只能通过时间戳方式设置。
4.3 各种数据类型的存储
php的数据类型(8种):
基本类型:int string boolean float
复合类型:array object resource null

基本类型 数据在memcache内部通过字符串存储:
memcache_第26张图片
memcache_第27张图片
复合类型 数据在memcache中是原样存储:
memcache_第28张图片
memcache_第29张图片
有的时候在memcache中需要把各种数据类型信息都变为字符串存储,就需要对复合类型信息进行序列化操作:serialize() unserailize()
4.4 第三个参数压缩作用
通过zlib进行压缩处理
4.5 php中其他相关操作方法
add() 给memcache增加一个key
不存在就增加,存在就报错
set() 给memcache设置key
不存在就增加,存在就修改

close() 关闭memcache连接,一般根据具体情况,设置到php代码的最后

decrement() 给key的值减少1 i–
increment() 给key的值累加1 i++

flush() 清空memcache的全部key

replace() 替换key的值为其他值
存在就替换,不存在就报错
5.终端命令方式操作
登录到memcache的操作终端:
telnet是远程登录协议:
memcache_第30张图片
登录memcache终端成功:
memcache_第31张图片
telnet提示不是内部或外部指令的解决:
控制面板–》程序和功能–》打开或关闭windows服务–》telnet客户端:
memcache_第32张图片
在终端窗口实现memcache的操作:
设置:
> set key 是否压缩 有效期 数据长度 [回车]
> 数据

> add key 是否压缩 有效期 数据长度 [回车]
> 数据

> replace key 是否压缩 有效期 数据长度 [回车]
> 数据
(数据真实长度 与 设置长度 要完全一致)
获取:
> get key
删除:
> delete key
> flush_all //删除全部的key

给memcache设置一个key和读取:
memcache_第33张图片
通过php程序也可以读取到终端窗口设置的key:
memcache_第34张图片
5.1 获取memcache统计的信息
memcache_第35张图片
上图中连接数指的是访问一次,连接一次,其实就是访问的次数,总共设置的key减去活跃的key意思就是多出来的key不是被删除了,就是过期了. memecache设置用多少的内存,如果超过了,会把你好长时间不用的key删掉,evictions意思就是删除了多少个这样的key

在php程序里边可以通过getStats()获得memcache服务器的统计信息。

利用SecureCRT也可以实现对memcache的终端操作:
memcache_第36张图片
memcache_第37张图片
6. 分布式memcache的部署
如果单个memcache保存的数据非常多,memcache本身工作负载就会非常高,为了降低该memcache的工作量,提高其运行速度,可以设置多个memcache平均分担工作量,该模式就是分布式。
(例如一个memcache要保存1000W的数据,如果平均分配到5个memcache服务器,则每个就只保留200W的数据)
Redis的分布式是“主从模式”结构,一主多从。
Memcache的分布式与Redis的不同,其是把一台memcache的工作平均分配给多个memcache分担。
分布式具体的实施:
1)可以在一个服务器里边开启多个memcache服务
2)可以配置多个服务器,每个服务器里边都运行memcache服务
memcache_第38张图片
每个memcache服务器都是平等的,中间通过“算法”保证数据的平均分配。
php代码的编写还保持原有习惯即可。
key的分配原则:依次轮询、求余
一台服务器开启三个memcache服务:
memcache_第39张图片
分布式php代码的设计:
memcache_第40张图片
无需考虑key存储在那个memcache服务器内部,memcache通过算法会自动给匹配上,不影响我们正常获得数据:
memcache_第41张图片
注意:
在每个php脚本文件内部服务器连接的顺序都要保持一致,否则数据有可能获取不到。
memcache_第42张图片
memcache_第43张图片
7.缓存失效
memcache中的key超过有效期、或被系统强制删除掉了。
7.1有效期过期
session信息过期(失效了),通过“懒惰”模式给删除的。
session是在文件中存储,如果session已经过期,其文件还是存在的,下次有一个用户访问session信息(用户登录系统),此时已经过期的session就有一定的几率被删除(session文件被删除)。

memcache中key的删除也是懒惰模式,如果超过有效期,该key还是存在的,当你get获取它的时候,其就消失了。
memcache_第44张图片
memcache_第45张图片
7.2 空间不足被强制删除
memcache的内存可用空间默认为64MB,如果存储的数据非常多,可用空间不足了。
此时仍然可以存储数据,因为memcache内部有LRU机制。
LRU: Least recently use 最近很少被使用的数据
内存空间如果不足,就会删除最近很少经常使用的数据。

如果不想使用LRU机制,就可以设置参数-M
开启memcache服务的时候带参数-M:
memcache_第46张图片
-M:内存空间耗尽,要报错,而不使用LRU机制删除数据

8.session入memcache
传统session的数据是在硬盘的文件中存储的。
该session很大情况用于存储用户的相关信息。用于判断一个用户是否登录系统。

两个服务器的session如果是文件形成存储,则他们的session互相不能通信。
两个服务器的session如果是存储在memcache中的,则他们的session可以通信。
memcache_第47张图片
一个网站是有多个服务器支撑的,用户在服务器1里边登录系统,其session持久化的信息报保存在一个memcache服务器里边,这样服务器2/3/4也可以去memcache读取session信息,就可以保证用户访问各个服务器的时候无需重复登录系统。
(以上情况还可以把session存储在mysql中)
8.1 具体操作
php.ini关于session的设置:
存储session形式:
memcache_第48张图片
存储在哪:
在这里插入图片描述
session存储到memcache的设置:
memcache_第49张图片
读取memcache中的session信息:
memcache_第50张图片
session保存到memcache中key的名称为session_id的值:
memcache_第51张图片
如果memcache是分布式的:
memcache_第52张图片

你可能感兴趣的:(nosql)