首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

[转]memcached全面剖解–3.memcached的删除机制和发展方向

2012-11-04 
[转]memcached全面剖析–3.memcached的删除机制和发展方向下面是《memcached全面剖析》的第三部分。发表日:200

[转]memcached全面剖析–3.memcached的删除机制和发展方向

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

          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,如下所示:

          ?

          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全面剖解–3.memcached的删除机制和发展方向

            ?

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

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

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

            总结

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

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

            下次由长野来介绍memcached的应用知识和应用程序兼容性等内容。

热点排行