Memcached详细介绍

1 Memcached概述

Memcached是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用。由livejounal旗下的danga公司开发的老牌nosql应用。目前全球很多用户都在使用它来构建自己的大负载网站和提高访问量超大网站的相应速度。
缓存一般用来保存一些经常存取的对象或数据(例如,浏览器会经常访问的网页缓存起来),通过缓存来存取对象或数据要比磁盘存取快很多。Memcached把经常存取的对象或数据缓存在内存中,内存中缓存的这些数据通过API的方式存取,数据就像一张大的Hash表,以key/value对的方式存在。Memcached通过缓存经常存取的对象或数据,来减轻数据库的压力,提高网站的响应速度,构建速度更快的可扩展的Web应用。
目前有facebool、twitter、mixi、校内网、新浪网、豆瓣、赶集网、开心网等公司使用Memcached。

1.1 工作流程

(1)检查客户端请求的数据是否在Memcached中存在,若存在直接返回结果;
(2)若不存在,查询数据库,返回结果并把结果缓存;
(3)每次修改数据库时要同时更新Memcached数据;
(4)内存空间用完之后使用LRU算法替换缓存。

1.2 特点

(1)基于文本行的协议,可以直接通过telnet管理
(2)基于libevent,异步io,高性能。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。
(3)对被缓存的数据没有备份,重启后对数据库产生较大的压力
(4)Memcached不互相通信的分布式,分布式由客户端完成

1.3 Memcached的命令

(1)add key flag expire length
key 给值起一个独特的名字,
flag 标志,要求为一个正整数,
expire 有效期,
length 缓存的长度(字节为单位),
(2)delete key [time seconds]
删除指定的 key。如加可选参数 time,则指删除 key,并在删除 key 后的 time 秒内,不允许get,add,replace 操作此 key。
(3)replace key flag expire length
参数和 add 完全一样,不单独写。
(4)get key
返回 key 的值。
(5)set 是设置和修改值
参数和 add ,replace 一样,但功能不一样。
(6)incr/decr key num
增加/减少值的大小。
应用场景:秒杀功能,
一个人下单,要牵涉数据库读取,写入订单,更改库存,及事务要求,对于传统型数据库来说,压力是巨大的。可以利用 Memcached 的 incr/decr 功能,在内存存储 count 库存量,秒杀 1000 台,每人抢单主要在内存操作,速度非常快。抢到 count<=1000 的号人,得一个订单号,再去另一个页面慢慢支付。
(7)统计命令:stats
(8)flush_all 清空所有的存储对象

2 Memcached的内存存储

Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比Memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,
以完全解决内存碎片问题。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块
分成组(chunk 的集合)。
Slab Allocator还有重复使用已分配的内存的目的。也就是说,分配到的内存不会释放,而是重复利用。
Slab Allocation的主要术语:
(1)Page:分配给Slab 的内存空间,默认是1MB。分配给 Slab 之后根据slab 的大小切分成 chunk。
(2)Chunk:用于缓存记录的内存空间。
(3)Slab Class:特定大小的chunk的组。
这里写图片描述
Memcached根据收到的数据的大小,选择最适合数据大小的Slab。Memcached中保存着Slab内空闲Chunk的列表,根据该列表选择Chunk,然后将数据缓存于其中。
这里写图片描述
Slab Allocator 解决了当初的内存碎片问题,但新的机制也给 Memcached 带来了新的问题。由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100 字节的数据缓存到 128 字节的Chunk 中,剩余的 28 字节就浪费了。对于该问题目前还没有完美的解决方案,但在文档中记载了比较有效的解决方案。
这里写图片描述

3 Memcached的删除机制和发展方向

(1)Memcached在数据删除方面有效利用资源
数据不会真正从 Memcached中消失,Memcached 不会释放已分配的内存。记录超时后,客户端就无法再看见该记录,其存储空间即可重复使用。
Memcached 内部不会监视记录是否过期,而是在 get时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,Memcached 不会在过期监视上耗费 CPU 时间。
(2)LRU:从缓存中有效删除数据的原理
Memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。因此,当 Memcached 的内存空间不足时(无法从 slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
(3)Memcached的最新发展方向
Memcached 的roadmap上有两个大的目标。一个是二进制协议的策划和实现,另一个是外部引擎的加载功能。
使用二进制协议的理由是它不需要文本协议的解析处理,使得原本高速的Memcached 的性能更上一层楼,还能减少文本协议的漏洞。目前已大部分实现,开发用的代码库中已包含了该功能。

4 Memcached并发控制

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。CAS协议解决这种并发修改问题。有线程试图修改当前key-value对的value时,先由gets方法得到item的版本号,操作完成提交数据时,使用cas方法谨慎变更,如果在本地对item操作过程中这个key-value对在Memcached server端被其它线程更改过,就放弃此次修改(乐观锁概念)。

Memcached使用libevent库来实现异步请求处理。此外,Memcached是一个多线程的程序,拥有细粒度pthread互斥锁机制。通过静态元素锁的哈希表来控制内存访问的并发性。哈希表的大小是基于配置的线程数量确定。这是在哈希表的内存使用情况和并行度之间权衡。尽管Memcached提供了这种细粒度锁机制,大部分操作,比如索引查找或更新和缓存驱逐或更新,依然需要全局锁,它可以阻止Memcached在多核CPU环境扩展。

5 Memcached不互相通信的分布式

Memcached尽量是“分布式”缓存服务器,但服务器端并没有分布式功能。各个Memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
这里写图片描述

6 Memcached的分布式集群算法

Memcached 是一个“分布式缓存”,然后 Memcached 并不像 MongoDB 那样,允许配置多个节点,且节点之间“自动分配数据”。就是说Memcached节点之间,是不互相通信的。因此,Memcached的分布式,要靠用户去设计算法,把数据分布在多个Memcached节点中。
(1)分布式之取模算法
最容易想到的算法是取模算法,即N个节点要,从0->N-1编号。key 对 N 取模,余 i,则 key 落在第 i 台服务器上。
这里写图片描述
(2)一致性哈希算法
首先求出Memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2 32仍然找不到服务器,就会保存到第一台Memcached服务器上。
这里写图片描述
从上图的状态中添加一台Memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
这里写图片描述
Consistent Hashing最大限度地抑制了键的重新分布。而且,有的Consistent Hashing 的实现方法还采用了虚拟节点的思想。使用一般的hash 函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum 上分配 100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。

7 MIXI案例研究

Mixi在提供服务的初期阶段就使用了Memcached。随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了Memcached。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值