Apache 是对进程的管理(消耗的是CPU)对内存的消耗很少
Memcache 是对内存的操作对 对内存的消耗大 对CPU的消耗小
Memcache 基本命令格式
<命令> <键> <标记> <有效期> <数据长度>
Memcache 主要用的是key=>value 的格式 1.某范围内随机
2. 碰撞要低
增: add 往内存增加一行新记录
语法: add key flag expire length 回车
key 给值起一个独特的名字
flag 标志,要求为一个正整数
expire 有效期
length 缓存的长度(字节为单位)
flag 的意义:
memcached 基本文本协议,传输的东西,理解成字符串来存储.
想:让你存一个 php 对象,和一个 php 数组,怎么办?
答:序列化成字符串,往出取的时候,自然还要反序列化成 对象/数组/json 格式等等.
这时候, flag 的意义就体现出来了.
比如, 1 就是字符串, 2 反转成数组 3,反序列化对象…..
expire 的意义:
设置缓存的有效期,有 3 种格式
1:设置秒数, 从设定开始数,第 n 秒后失效.
2:时间戳, 到指定的时间戳后失效.
比如在团购网站,缓存的某团到中午 12:00 失效. add key 0 1379209999 6
3: 设为 0. 不自动失效.
注: 有种误会,设为 0,永久有效.错误的.
Memcache 没有集群之间相互管理的方案(自己去想办法) redis 集群在几台服务器上边自动的达到一个均衡
Tp5 默认是用file进行缓存 我们写的 小程序 就是用的文件保存但是 tp5中已经封装好了那些缓存 最终都是用cache进行调用的
incr ,decr 命令:增加/减少值的大小语法: incr/decr key num示例:
注意:incr,decr 操作是把值理解为 32 位无符号来+-操作的. 值在[0-2^32-1]范围内
应用场景——秒杀功能, 一个人下单,要牵涉数据库读取,写入订单,更改库存,及事务要求, 对于传统型数据库来说, 压力是巨大的. 可以利用 memcached 的 incr/decr 功能, 在内存存储 count 库存量, 秒杀 1000 台每人抢单主要在内存操作,速度非常快, 抢到 count<=1000 的号人,得一个订单号,再去另一个页面慢慢支付
1:内存的碎片化如果用 c 语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的现象,—称为内存的碎片化.
2: slab allocator 缓解内存碎片化memcached 用 slab allocator 机制来管理内存. slab allocator 原理: 预告把内存划分成数个 slab class 仓库.(每个 slab class 大小 1M)各仓库,切分成不同尺寸的小块(chunk). (图 3.2)需要存内容时,判断内容的大小,为其选取合理的仓库.
memcached 根据收到的数据的大小, 选择最适合数据大小的 chunk 组 (slab class)memcached 中保存着 slab class 内空闲 chunk 的列表, 根据该列表选择空的 chunk, 然后将数据缓存于其中。
分布式集群算法
memcached 如何实现分布式? 在第 1 章中,我们介绍 memcached 是一个”分布式缓存”,然后 memcached 并不像 mongoDB 那 样,允许配置多个节点,且节点之间”自动分配数据”. 就是说–memcached 节点之间,是不互相通信的. 因此,memcached 的分布式,要靠用户去设计算法,把数据分布在多个 memcached 节点中.
分布式之取模算法最容易想到的算法是取模算法,即 N 个节点要,从 0->N-1 编号. key 对 N 取模,余 i,则 key 落在第 i 台服务器上
取模算法对缓存命中率的影响假设有 8 台服务器, 运行中,突然down 一台, 则求余的底数变成7后果:
一般地,我们从数学上归纳之: 有 N 台服务器, 变为 N-1 台, 每 N*(N-1)个数中, 只有(n-1)个单元,%N, %(N-1)得到相同的结果所以 命中率在服务器 down 的短期内, 急剧下降至 (N-1)/(N*(N-1)) = 1/(N-1)所以: 服务器越多, 则 down 机的后果越严重!