Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 5

memcached 介绍

 像这类 UPDATE 比较频繁,数据丢失也不太要紧的数据,可以使用 memcached 技术。有时候某些性质


的数据干脆都不创建数据库表,直接就在内存中进行操作,比如 qq 在线状态(在线,离线,忙碌
等),由于变化频繁,如果一变就去 UPDATE 数据库,显得没有太大的意义,更重要的是由于大量的
qq 用户,大家的状态都在随时变化,如果都去访问数据库,会给数据库造成巨大的压力。
 memcached 是 LiveJournal 旗下的 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已
经成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
 为什么会有 Memcache 和 memcached 两种名称?其实 Memcache 是这个项目的名称,而 memcached
是它服务器端的主程序文件名。
 传统的 Web 应用都将数据保存到 RDBMS 中,应用服务器从 RDBMS 中读取数据、处理数据并在浏览器
中显示。但是随着数据量增大、访问的集中、就会出现 RDBMS 的负担加重、数据库响应变慢、导致
整个系统响应延迟增加。而 memcached 就是为了解决这个问题而出现的,memcached 是一款高性能
的分布式内存缓存服务器,一般目的是为了通过缓存数据库的查询命中减少数据库压力、提高应用响
应速度、提高可扩展性。说白了,memcached 是一种内存缓存技术,其目的就是提速。由于内存的访
问速度是最快的,它实现把数据放入内存,并通过内存来访问数据,从而实现提速的目的。

 memcached 的工作就是在专门的机器的内存里维护一张巨大的 hash 表。该 hash 表的结构为键值对


(key-value)。
 Key 的存储类型一般是字符串,不能重复。
 value 存储类型可以是除资源类型意外的其他任何类型:字符串、数值、 NULL 值、数组、对象、
布尔、二进制数据(能放二进制数据意味着可放图片/视频,但内存中一般不会也没有那么大的空
间来放这些大数据)。
 对于一个查询,比如有一个学生数据库,客户端(Web 浏览器)通过表单里输入学号并提交表单,请
求 Web 服务器的 PHP 文件。
 最慢的做法是 PHP 被写成直接查询(SELECT)数据库并返回数据。
 稍微快一点的方案:真静态。在添加或修改学生信息的同时,在磁盘中还保存一个学生信息页面,
这样在执行查询时,通过学号找到这个静态页面。但是速度还是不够快。
 直接操作内存是最快的方法,即通过 memcached 实现。客户端表单数输入学号并发送请求 Web
服务器(链接到一个 php 文件),php 文件先查 memcached 的 hash 表中是否有该数据,如果有,
就直接从那里获取数据。如果没有,则再去读取数据库,同时也把数据存到 memcached 的 hash
表中(比如学号 100 号是键,成绩是值 99.5)。这里需要注意的是:如果对数据的实时性要求非
常高,就需要明白访问数据库和将数据存入 memcached 中两者之间还是有一个时间滞后的。
 Memcached 机制和特点:
 Memcached 基于 c/s 结构:
 备 注 知 识 点 : Web 服 务 器 ( Apache ) 、 数 据 库 服 务 器 、 memcache 缓 存 服 务 器
(memcached,用作缓存)、负载均衡服务器这些都是独立的系统,比如重启 apache,不会
影响 memcached 中的数据。
 不是直接由 Web 浏览器客户端对 memcached 进行操作的,而是 Web 浏览器客户端向 Web 服
务器的某个 PHP 发出请求(这里是 b/s 结构,即 browser/client,浏览器端只需要有浏览器就
行,无须安装其他程序),然后由 PHP(也可以是其他如 c/c++等)连接 memcached 来对其
进行操作(这里是 c/s 结构,即 client/server,memcached 是服务器端,PHP 端是客户端,c/s
结构在客户端需要安装客户端程序才能和服务器端交互),并将结果返回给 Web 浏览器客户
端,对 memcached 的操作都是由 Web 服务器的 PHP 完成的,和 Web 浏览器客户端没有任何
关系。
 Memcached 的客户端通信并不使用 XML 等格式,而使用简单的基于文本行的协议,因此,
通过 telnet 工具也能在 memcached 上读写数据。
 Memcached 基于 libevent 事件处理并发机制:
 不管是什么服务器,都有各自处理并发的机制。比如:Apache 是 MPM 机制,MySQL 是多线
程机制,而 memcached 是 libevent 机制。
 Libevent 是一套跨平台的事件处理接口的封装,能够兼容包括 windows/Linux/BSD/Solaris 等操
作系统的事件处理。
 Memcached 使用 Libevent 来进行网络并发连接的处理,能够保证在很大并非的情况下,仍旧
能够保持快速的相应能力。
 内置内存存储方式:为了提高性能,memcached 中保存的数据都存储在 memcache 内置的内
存存储空间中。由于数据仅存在于内存中,因此,重启 memcached、重启操作系统就会导致全
部数据消失。另外,内容容量达到指定值之后,就基于 LRU(Least Recently Used)算法自动删
除不使用的缓存(在 hash 表中还有一个最早访问时间的字段,如果表满了后会先自动删除最早
访问时间的数据行)。memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的
永久性问题。
 基于客户端的分布式:
 在高并发环境下,大量的读、写请求涌向数据库,此时磁盘 IO 将成为瓶颈,从而导致过高的
响应延迟,因此缓存应运而生。无论是单机缓存还是分布式缓存都有其适应场景和优缺点,
当今存在的缓存产品也是数不胜数,最常见的有 redis 和 memcached 等。
 缓存的本质:
 计算机体系缓存:什么是缓存,我们先看看计算机体系结构中的存储体系,根据冯 ·诺依
曼计算机体系结构模型,计算机分为五大部分:运算器、控制器、存储器、输入设备、
输出设备。结合现代计算机,CPU 包含运算器和控制器两个部分,CPU 负责计算,其需
要的数据由存储提供,存储分为几个级别,就拿我当前的 PC 举个例子,我的机器存储
清单如下:(1)356G 的磁盘;(2)4G 的内存;(3)3MB 三级缓存;(4)256KB 二级缓存(pre core)。
除了上述部分,还有 CPU 内的寄存器,当然有的计算机还有一级缓存等。CPU 运算器工
作的时候需要数据,数据哪里来?首先从距离 CPU 最近的二级缓存去拿,这块缓存速度
最快,通常也是体积最小,因为价格最贵。存储体系就像个金子塔,最上层最快,价格
最贵,最下层最慢,价格也最便宜,CPU 的数据源优先级一层层从上到下去寻找数据。
除了最慢的那块存储,在计算机体系中,相对较快的那些存储都可以被称为缓存,他们
解决的问题是让存储访问更快。
 计算机体系存储系统模型扩展到应用也是一样,应用需要数据,数据哪里来?缓存(更快
的存储)->数据库(较慢的存储),他们的工作流程大致如下图所示,即带缓存的应用系
统的一般存储访问流程为:首先访问缓存较快的存储介质,如果命中且未失效则返回内
容,如果未命中或失效则访问较慢的存储介质将内容返回同时更新缓存。

 Memcached 分布式实现原理:
 Memcached 是不互相通信的分布式:Memcached 尽管是分布式缓存服务器,但服务器
端并没有分布式功能,各个 memcached 不会互相通信共享信息。既然 memcached 不相
互通信,那么 memcached 是如何实现分布式的呢?memcached 的分布式实现主要依赖
客户端来实现, memcached 的分布式是由客户端 memcache 对象来实现的。
 缓存的存储的一般流程:当数据到达客户端,客户端实现的算法就会根据“键”来决定
保存的 memcached 服务器,服务器选定后,命令他保存数据。取的时候也一样,客户端
根据“键”选择服务器,使用保存时候的相同算法就能保证选中和存的时候相同的服务
器。

 算法:
 余数计算分散法:余数计算分散法是 memcached 标准的 memcached 分布式方法,
算法: CRC($key)%N。该算法下,客户端首先根据 key 来计算 CRC,然后结果对服务
器数进行取模得到 memcached 服务器节点,对于这种方式有两个问题值得说明一下:
 当选择到的服务器无法连接的时候,一种解决办法是将尝试的连接次数加到
key 后面,然后重新进行 hash,这种做法也叫 rehash。
 第二个问题也是这种方法的致命的缺点,尽管余数计算分散发相当简单,数据
分散也很优秀,当添加或者移除服务器的时候,缓存重组的代价相当大。
 Consistent Hashing 算法:
 Consistent Hashing 算法描述如下:首先求出 memcached 服务器节点的哈希值,
并将其分配到 0~2^32 的圆上,这个圆我们可以把它叫做值域,然后用同样的
方法求出存储数据键的哈希值,并映射到圆上。然后从数据映射到的位置开始
顺时针查找,将数据保存到找到的第一个服务器上,如果超过 0~2^32 仍找不
到,就会保存在第一台 memcached 服务器上:

 再抛出上面的问题,如果新添加或移除一台机器,在 consistent Hashing 算法下


会有什么影响。上图中假设有四个节点,我们再添加一个节点叫 node5:

 添加了 node 节点之后,node5 被放在了 node4 与 node2 之间,本来映射到


node2 和 node4 之间的区域都会找到 node4,当有 node5 的时候,node5 和
node4 之间的还是找到 node4,而 node5 和 node2 之间的此时会找到 node5,因
此当添加一台服务器的时候受影响的仅仅是 node5 和 node2 区间。
 优化的 Consistent Hashing 算法:
 上面可以看出使用 consistent Hashing 最大限度的抑制了键的重新分配,且有的
consistent Hashing 的实现方式还采用了虚拟节点的思想。问题起源于使用一般
hash 函数的话,服务器的映射地点的分布非常不均匀,从而导致数据库访问倾
斜,大量的 key 被映射到同一台服务器上。为了避免这个问题,引入了虚拟节
点的机制,为每台服务器计算出多个 hash 值,每个值对应环上的一个节点位置,
这种节点叫虚拟节点。而 key 的映射方式不变,就是多了层从虚拟节点再映射
到物理机的过程。这种优化下尽管物理机很少的情况下,只要虚拟节点足够多,
也能够使用得 key 分布的相对均匀。
 具体操作:见相关说明。
 Memcached 的安装:见安装说明。如果需要使用 memcache 服务器,则应在机器上安装 memcache 服
务器,即 memcached。
 对 memcached 进行操作:
 通过 telnet 工具对 memcached 进行操作:具体操作见相关说明。
 可以通过 PHP 程序对 memcached 进行操作,有三种形式:
 Memcache 扩展( php_memcache.dll ): 是 memcache 一个比较底层的开发库,对其的安装、
配置和操作见相关说明。
 Memcached 扩展(php_memcached.dll):另一个 memcached 是比较新的开发库。
 Socket 套接字操作(memcached-client.php(函数)):具体操作见相关说明。
 memcached 数据什么时候销毁:
 关闭或重启 memcached(或者 Memcached 所在计算机关闭或重启)。
 Flush 或 delete 操作。

参考文献:
《大型分布式网站架构设计与实践》
《memcached 全面解析》

You might also like