`
luckaway
  • 浏览: 137767 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

下面是《memcached全面剖析》的第二部分。 发表日:2008/7/9 作者:前坂徹(Toru

阅读更多
下面是《memcached全面剖析》的第三部分。

发表日:2008/7/16
作者:前坂徹(Toru Maesaka)
原文链接:http://gihyo.jp/dev/feature/01/memcached/0003

前几次的文章在这里:

    * 第1次:http://tech.idv2.com/2008/07/10/memcached-001/
    * 第2次:http://tech.idv2.com/2008/07/11/memcached-002/

    * memcached在数据删除方面有效利用资源
          o 数据不会真正从memcached中消失
          o Lazy Expiration
    * LRU:从缓存中有效删除数据的原理
    * memcached的最新发展方向
          o 关于二进制协议
          o 二进制协议的格式
          o HEADER中引人注目的地方
    * 外部引擎支持
          o 外部引擎支持的必要性
          o 简单API设计的成功的关键
          o 重新审视现在的体系
    * 总结

memcached是缓存,所以数据不会永久保存在服务器上,这是向系统中引入memcached的前提。本次介绍memcached的数据删除机制,以及memcached的最新发展方向——二进制协议(Binary Protocol)和外部引擎支持。
memcached在数据删除方面有效利用资源
数据不会真正从memcached中消失

上次介绍过, memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible,透明),其存储空间即可重复使用。
Lazy Expiration

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU:从缓存中有效删除数据的原理

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

不过,有些情况下LRU机制反倒会造成麻烦。memcached启动时通过“-M”参数可以禁止LRU,如下所示:

$ memcached -M -m 1024

启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。不指定具体数值则使用默认值64MB。

指定“-M”参数启动后,内存用尽时memcached会返回错误。话说回来,memcached毕竟不是存储器,而是缓存,所以推荐使用LRU。
memcached的最新发展方向

memcached的roadmap上有两个大的目标。一个是二进制协议的策划和实现,另一个是外部引擎的加载功能。
关于二进制协议

使用二进制协议的理由是它不需要文本协议的解析处理,使得原本高速的memcached的性能更上一层楼,还能减少文本协议的漏洞。目前已大部分实现,开发用的代码库中已包含了该功能。 memcached的下载页面上有代码库的链接。

    * http://danga.com/memcached/download.bml

二进制协议的格式

协议的包为24字节的帧,其后面是键和无结构数据(Unstructured Data)。实际的格式如下(引自协议文档):

Byte/     0       |       1       |       2       |       3       |  
    /              |               |               |               |  
   |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
   +---------------+---------------+---------------+---------------+
  0/ HEADER                                                        /  
   /                                                               /  
   /                                                               /  
   /                                                               /  
   +---------------+---------------+---------------+---------------+
24/ COMMAND-SPECIFIC EXTRAS (as needed)                           /  
  +/  (note length in th extras length header field)               /  
   +---------------+---------------+---------------+---------------+
  m/ Key (as needed)                                               /  
  +/  (note length in key length header field)                     /  
   +---------------+---------------+---------------+---------------+
  n/ Value (as needed)                                             /  
  +/  (note length is total body length header field, minus        /  
  +/   sum of the extras and key length body fields)               /  
   +---------------+---------------+---------------+---------------+
  Total 24 bytes

如上所示,包格式十分简单。需要注意的是,占据了16字节的头部(HEADER)分为请求头(Request Header)和响应头(Response Header)两种。头部中包含了表示包的有效性的Magic字节、命令种类、键长度、值长度等信息,格式如下:

Request Header

Byte/     0       |       1       |       2       |       3       |
    /              |               |               |               |
   |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
   +---------------+---------------+---------------+---------------+
  0| Magic         | Opcode        | Key length                    |
   +---------------+---------------+---------------+---------------+
  4| Extras length | Data type     | Reserved                      |
   +---------------+---------------+---------------+---------------+
  8| Total body length                                             |
   +---------------+---------------+---------------+---------------+
12| Opaque                                                        |
   +---------------+---------------+---------------+---------------+
16| CAS                                                           |
   |                                                               |
   +---------------+---------------+---------------+---------------+

Response Header

Byte/     0       |       1       |       2       |       3       |
    /              |               |               |               |
   |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
   +---------------+---------------+---------------+---------------+
  0| Magic         | Opcode        | Key Length                    |
   +---------------+---------------+---------------+---------------+
  4| Extras length | Data type     | Status                        |
   +---------------+---------------+---------------+---------------+
  8| Total body length                                             |
   +---------------+---------------+---------------+---------------+
12| Opaque                                                        |
   +---------------+---------------+---------------+---------------+
16| CAS                                                           |
   |                                                               |
   +---------------+---------------+---------------+---------------+

如希望了解各个部分的详细内容,可以checkout出memcached的二进制协议的代码树,参考其中的docs文件夹中的protocol_binary.txt文档。
HEADER中引人注目的地方

看到HEADER格式后我的感想是,键的上限太大了!现在的memcached规格中,键长度最大为250字节,但二进制协议中键的大小用2字节表示。因此,理论上最大可使用65536字节(2<sup>16</sup>)长的键。尽管250字节以上的键并不会太常用,二进制协议发布之后就可以使用巨大的键了。

二进制协议从下一版本1.3系列开始支持。
外部引擎支持

我去年曾经试验性地将memcached的存储层改造成了可扩展的(pluggable)。

    * http://alpha.mixi.co.jp/blog/?p=129

MySQL的Brian Aker看到这个改造之后,就将代码发到了memcached的邮件列表。 memcached的开发者也十分感兴趣,就放到了roadmap中。现在由我和 memcached的开发者Trond Norbye协同开发(规格设计、实现和测试)。和国外协同开发时时差是个大问题,但抱着相同的愿景,最后终于可以将可扩展架构的原型公布了。代码库可以从memcached的下载页面 上访问。
外部引擎支持的必要性

世界上有许多memcached的派生软件,其理由是希望永久保存数据、实现数据冗余等,即使牺牲一些性能也在所不惜。我在开发memcached之前,在mixi的研发部也曾经考虑过重新发明memcached。

外部引擎的加载机制能封装memcached的网络功能、事件处理等复杂的处理。因此,现阶段通过强制手段或重新设计等方式使memcached和存储引擎合作的困难就会烟消云散,尝试各种引擎就会变得轻而易举了。
简单API设计的成功的关键

该项目中我们最重视的是API设计。函数过多,会使引擎开发者感到麻烦;过于复杂,实现引擎的门槛就会过高。因此,最初版本的接口函数只有13个。具体内容限于篇幅,这里就省略了,仅说明一下引擎应当完成的操作:

    * 引擎信息(版本等)
    * 引擎初始化
    * 引擎关闭
    * 引擎的统计信息
    * 在容量方面,测试给定记录能否保存
    * 为item(记录)结构分配内存
    * 释放item(记录)的内存
    * 删除记录
    * 保存记录
    * 回收记录
    * 更新记录的时间戳
    * 数学运算处理
    * 数据的flush

对详细规格有兴趣的读者,可以checkout engine项目的代码,阅读器中的engine.h。
重新审视现在的体系

memcached支持外部存储的难点是,网络和事件处理相关的代码(核心服务器)与内存存储的代码紧密关联。这种现象也称为tightly coupled(紧密耦合)。必须将内存存储的代码从核心服务器中独立出来,才能灵活地支持外部引擎。因此,基于我们设计的API,memcached被重构成下面的样子:
memcached-0003-001.png

重构之后,我们与1.2.5版、二进制协议支持版等进行了性能对比,证实了它不会造成性能影响。

在考虑如何支持外部引擎加载时,让memcached进行并行控制(concurrency control)的方案是最为容易的,但是对于引擎而言,并行控制正是性能的真谛,因此我们采用了将多线程支持完全交给引擎的设计方案。

以后的改进,会使得memcached的应用范围更为广泛。
总结

本次介绍了memcached的超时原理、内部如何删除数据等,在此之上又介绍了二进制协议和外部引擎支持等memcached的最新发展方向。这些功能要到1.3版才会支持,敬请期待!

这是我在本连载中的最后一篇。感谢大家阅读我的文章!

下次由长野来介绍memcached的应用知识和应用程序兼容性等内容。
分享到:
评论

相关推荐

    memcached安装及java应用使用memcached

    虽然描述部分是空的,但我们可以推测文章可能涵盖了安装memcached的基本步骤,以及Java开发者如何集成并利用memcached来提升应用性能。 **标签解析:** 1. **源码**:可能意味着文章会涉及memcached的源代码安装或...

    memcached全面剖析.pdf

    memcached是一款高性能、分布式内存对象缓存系统,最初由Danga Interactive开发,用于减少数据库负载,通过缓存数据和对象来加速Web应用程序。它以key-value的形式存储数据,支持多种编程语言,如Perl、PHP、Python...

    QzzmServer V1.0.4准正式版(集成nginx+php+mysq+memcached)

    该资源为QzzmServer 1.0.3升级补丁 QzzmServer V1.0.4准正式版(集成nginx+php+mysq+memcached) 1.0.3版传送门如下 第一部分 ...第二部分 http://download.csdn.net/detail/qzzmcom/5696679

    memcached全面剖析

    《memcached全面剖析》是一本针对memcached技术的详细教程,旨在为技术人员提供深入理解和使用此缓存系统的全面指导。通过PDF形式,这份资料方便了读者在线阅读或下载保存,便于随时查阅和学习。作为一款广泛应用于...

    spring整合memcached

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Memcached则是一种高性能、分布式的内存对象缓存系统。这篇文章将详细介绍如何将Spring与Memcached整合,帮助新手入门这一技术栈。 首先,我们需要...

    查看、分析memcached使用状态

    本文将深入探讨 Memcached 的使用及其状态分析。 首先,Memcached 以其内存存储机制著称,这使得它在读取速度上远超于传统的硬盘存储,比如使用哈希散列存储数据到硬盘。在内存价格日益降低的今天,使用内存作为...

    MemCached 全面剖析 memcached.pdf(中文)

    ### MemCached 全面剖析 #### 一、MemCached 基础介绍 **1.1 MemCached 是什么?** MemCached 是一个高性能、分布式内存对象缓存系统,旨在减轻数据库负担,加速动态Web应用的速度。它通过在内存中缓存数据和对象...

    memcached全面剖析资料

    标题“memcached全面剖析资料”表明我们将深入探讨memcached,这是一个流行的分布式内存对象缓存系统,用于提高Web应用程序的性能。它通过将数据存储在内存中来减少对数据库的访问,从而加快了数据检索速度。这篇...

    [2022年]最新萝卜影视APP源码麻花金色UI最新原生版APP

    fileing、memcached、sg11 分享页面在苹果cms程序/reg/reg.html在这里修改 前端 推荐9是首页轮播图 推荐8是分类轮播图 推荐6是首页视频推荐 热播就是热播推荐 这里有完整编译app教程 属于极光颜色的版本 视频下载等 ...

    Windows 下安装 Memcached1

    ### Windows 下安装 Memcached #### 一、概述 本文旨在详细介绍如何在Windows环境下安装Memcached。Memcached是一款高性能、分布式内存对象缓存系统,用于加速动态Web应用,减轻数据库负担。由于官方并未直接提供...

    memcached全面剖析.zip

    memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删除机制和发展方向 memcached全面剖析–4. memcached的分布式算法 memcached全面剖析–5. memcached的应用和兼容程序 可关注...

    dubbo技术介绍

    code.alibabatech.com /w iki/display/dubbo/U ser+G uide-zh#U serG uide-zh-S im ple% E 7% 9B % 91% E 6% κ 2/100 API参考手册 配置API 注解API 模型API 上下文API 服务API 配置参考手册 &lt;dubbo:service/&gt; ...

    memcached 双机热备

    memcached 双机热备详细安装过程,以及与spring集成过程

    memcached全面剖析.docx

    **第 1 章 memcached 的基础** **1.1 memcached 是什么?** memcached 是一个高性能、分布式内存对象缓存系统,用于减轻数据库负载,提高 Web 应用程序的性能。它是一个简单的键值对存储系统,主要用于临时存储...

    memcached入门到理解

    memcached入门到理解 博文链接:https://johnnyhg.iteye.com/blog/237733

    http://www.terracotta.org/

    7. **监控和管理**:介绍监控和管理分布式缓存系统的方法,如日志分析、性能指标监控和故障排查。 8. **工具使用**:讲解使用特定工具(可能是Terracotta提供的)来简化配置、监控和维护缓存系统的过程。 通过深入...

    CentOS 安装配置memcached

    CentOS 安装配置 Memcached 在本文中,我们将详细介绍如何在 CentOS 系统上安装和配置 Memcached。Memcached 是一个高性能的分布式内存对象缓存系统,广泛应用于各种 web 应用程序中,以提高应用程序的性能和响应...

Global site tag (gtag.js) - Google Analytics