MEMCACHED的{zj0}实践和内部机制(译)

原始文章 Memcached Internals 是在 2008年MySQL Conf 上的一篇
本文对memcached的使用提出了一些建议,并讲述了一些memcached内部的一些实现机制。是我们可以更好的理解应用memcached。

MEMCACHED的{zj0}实践

Memcached是一个高性能的分布式缓存系统,它是独立应用的,当前被许多大型的网站使用,比如Facebook(在2008年{dy}季度有2TB的缓存), Livejournal, Mixi, Hi5等,然而他也是一个极端简单的软件:所有的逻辑在客户端,没有安全模型,容灾处理,备份机制或持久化。然而这些并不影响他被开发这发布到各种情况的环境中,如下有Brian做的一些关于memcached的{zj0}时间的建议:

1.不要想行级别(数据库)的缓存,考虑复杂对象。
2.不要在数据库服务器上运行memcached,给你的数据库提供一切可能使用的内存。
3.不要担心TCP的延迟-本机的TCP/IP已经被优化为内存拷贝。
4.考虑 multi-get-在任何可能的情况下用并发来处理事情。
5.不是所有的memcached客户端都是等同的,做你自己的调研。-提示使用 的。

片分配器-MEMCACHED的心脏

memcached的心脏是他的内存片分配器,{dy}感觉令人有点畏惧,但是当你明白他架构中所采用的平衡机制等,你会从内心中体会出他确实是一个高雅的解决方案。

1.memcached所能分配的内存{zd0}值仅由系统的架构决定(32/64位)
2.key值大小限制到250字节,data值大小限制到1mb
3.在启动时,memcached获取需要的内存-在性能前浪费内存
4.分配的内存由片分配器切分为不同大小的桶。
5.默认情况下片分配器将创建32-39个桶用来存放{zd0}到1mb大小的对象。
6.你可以在编译时设置页大小,并在启动时设置片大小。
7.每一个被存储的对象存在最相近大小的桶中-是的,内存是被浪费的。
8.碎片是个问题-无论是定义片大小或时常回收/冲刷你的缓存。
9.如果在一个不同的片类中没有未被使用的内存,该内存将在需要的时候被重分配。
10.保证 no-paging,-实用的是将他变小来避免出问题。

内存管理

内存管理使用的是算法

1.每一个片类有他自己的LRU-回收目标依赖于对象的大小
2.没秒钟检查一次截止时间戳-最小寿命是1秒
3.异步处理被标志为删除的对象-每5秒检查回收一次
4.上面两个时间的不一致会导致次{zj0}回收规则
5.可以xx禁用LRU-这样做自己担当风险

关于失效和截止期的{zj0}实践

Memcached不提供任何关于删除一个相关联key集合(对象,名称等等)的机制.不管是好是坏,你需要在prepend和append命令的帮助下自己实现该功能,然而,需要小心这个1mb 大小的限制。一个非常简单的处理该情况的方式是xx放弃一起失效过程。

1.在任何可能的时候通过设置截止时间来使你的数据失效-memcached会做所有的工作。
2.生成有提示性的key-比如,在更新,,将成为key的一部分
3.作为奖励点,在memcached中存储版本号-称作一代
4.后面的将会很快添加到memcached中-只要 Brian 考虑做他。

ROADMAP和未来展望

1.二进制协议在处理中
2.支持代处理-前面章节提到
3.多引擎支持:基于字符的,持久的,队列的
4.Facebook已经修改过的核心,有望被贡献出来。

感谢Brian和Alan的伟大工作,不要忘记做书签并常回来看看(指原文)。



郑重声明:资讯 【MEMCACHED的{zj0}实践和内部机制(译)】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——