下面是《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的应用知识和应用程序兼容性等内容。
- 浏览: 168171 次
- 性别:
- 来自: 北京
最新评论
-
TonyLee0329:
求真实案例
java中compareTo比较两个日期大小 -
fdyo3:
高手
两个值相同的Integer类型用!=比较出错的问题 -
宋小寒:
http://www.blogjava.net/sternin ...
java多线程socket通信---Telnet
发表评论
-
在同一台服务器上配置多个Tomcat
2015-08-19 18:00 745在一台服务器上配置 ... -
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
2015-08-19 14:25 1204Mybatis MapperScannerConfig ... -
jboss之启动加载过程详解(-)
2015-05-18 15:06 1223今天看了看jboss的boot.l ... -
Mybatis中几个重要类
2015-04-24 18:44 1323本文基于Mybatis3.2.0版本的代码。 1.org. ... -
『转』Spring Security的核心拦截器
2014-08-07 11:36 9581. HttpSessionContextIntegrat ... -
quartz CronExpression表达式
2014-07-24 14:33 551一个cron表达式有至少6 ... -
environments was not found on the java.library.path: E:\Program Files (x86)\Java
2014-07-23 11:10 926启动的时候出现的这个信息,不是错误,程序也可以正常的运行, ... -
java String 以及字符串直接量 与 字符串驻留池 ...
2014-07-16 13:56 944字符串 (String) 是 java 编程语言中的核心类 ... -
hibernate缓存机制
2014-07-03 00:02 753http://www.blogjava.net/tbwshc/ ... -
hibernate修改部分字段
2014-07-02 23:39 763http://blog.csdn.net/kkdelta/ar ... -
解惑 spring 嵌套事务
2014-06-24 15:44 715/** * @author 王政 * @dat ... -
浅析Java虚拟机结构与机制
2014-05-07 17:04 534浅析Java虚拟机结构与机制 本文旨在给所有希望了解J ... -
多语言调用之 Java调用C/C++
2014-04-09 14:52 6931.创建一个类com.test.TestCall内容如下 ... -
多线程实例
2014-04-09 14:47 533编写具有多线程能力的程序经常会用到的方法有: r ... -
java中的native关键字
2014-04-09 11:43 734JNI是Java Native Interface的 ... -
Spring分布式事务在service中动态切换数据源
2014-04-02 18:23 1137项目采用的是struts2+spring+ibatis架构, ... -
java的finalize
2014-03-31 14:04 523目录 基本预备相关知 ... -
读懂tomcat6 之Catalina.sh --注释版
2014-03-24 10:27 1167粗体字部分是我的注释,可能对那些不太熟悉Shell 的人有 ... -
tomcat下使用cronolog对catalina.out日志文件分割
2014-03-24 10:24 880tomcat 的catalina.out文件的不断 ... -
jsp直接使用session
2014-03-12 11:07 726在servlet中,要得到session并设值 要用 requ ...
相关推荐
Java Memcached2是一款基于Java实现的Memcached客户端库,它提供了与Memcached服务器通信的能力,以便在分布式环境中利用Memcached的高效缓存功能。Memcached是一种高性能、分布式内存对象缓存系统,常用于减轻...
2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动...
gomemcached, 一个用于围棋的memcached二进制 gomemcached这是中的一个memcached二进制协议工具包。它提供客户端和服务器功能以及一小部分示例服务器,如果我值得纯度,就可以以使用服务器。前端服务器设计 基本设计...
下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’...
使用memcached 方法 package com.war.common.util; import com.danga.MemCached.*; import java.util.Date; public class MemCached { protected static MemCachedClient mcc; protected static Logger log; ...
编写自定义脚本时,应确保正确地执行了memcached二进制文件,并传递了所有必要的参数。 ```bash #!/bin/bash # 自定义启动脚本示例 memcached -p 11212 -u nobody -m 64 ``` 将此脚本保存为可执行文件,并设置开机...
1. 首先,根据服务器架构选择合适的Memcached二进制文件进行安装。 2. 安装完成后,启动Memcached服务,确保它在后台运行。 3. 对于PHP7的Memcache扩展,将其解压后放置到PHP的`ext`目录下,并在php.ini配置文件中...
- 在提供的压缩包中,可能包含了简单的Java代码示例,如`memcached`和`memcached2`两个文件。这些文件可能演示了如何创建客户端,存储和检索数据的基本步骤。通过阅读和运行这些示例,你可以更好地理解Java与...
1. **下载安装包**:首先,你需要找到适用于Windows 64位系统的memcached二进制文件,通常可以在官方网站或者第三方软件库下载。 2. **解压和配置**:解压缩下载的文件,将解压后的memcached.exe放到一个合适的位置...
- 安装完成后,Memcached二进制文件通常位于`/usr/local/bin/`目录下。 3. 验证Memcached安装: - 使用`ls`命令查看Memcached是否在正确的位置:`# ls -al /usr/local/bin/mem*` 4. 启动Memcached服务: - 为了...
1. **下载Memcached**: 首先,你需要从官方网站(https://memcached.org/downloads)或第三方源获取适用于Windows的Memcached二进制版本。通常会提供预编译的.zip文件。 2. **解压文件**: 解压缩下载的文件到你选择的...
'memcached2' => [ 'driver' => 'memcached', 'servers' => [ [ 'host' => env('MEMCACHED_HOST_2', '127.0.0.2'), 'port' => env('MEMCACHED_PORT_2', 11211), 'weight' => 100, ], ], ], ], ``` 别忘了...
2. **配置**:创建或修改`memcached.conf`配置文件,设置监听端口、最大内存、超时时间等参数。 3. **启动**:通过命令行工具启动Memcached服务。 4. **客户端库**:选择合适的编程语言(如PHP、Python、Java等)的...
这可以通过下载Memcached二进制包,然后启动服务来完成。 2. **选择Java客户端**:如上所述,你可以选择spymemcached或xmemcached作为Java客户端。这两个库都提供了与Memcached服务器交互的API。你需要将对应的jar...
2. 进入目录:`cd memcached-1.4.15` 3. 配置,指定libevent库的位置(如果需要):`./configure --with-libevent=/usr/local` 4. 编译:`make` 5. 安装:`sudo make install` 安装完成后,启动memcached服务: 1....
Memcached基于键值对(key-value pairs)工作,允许用户存储任何序列化对象,如字符串、整数或二进制数据。它不提供持久化存储,这意味着如果服务器重启,所有缓存的数据都会丢失。因此,通常将Memcached用作短期...
2. **连接服务器**:通过客户端建立与Memcached服务器的连接,可以设置连接池大小以优化资源使用。 3. **操作缓存**:利用提供的API进行数据的存储、检索和删除。例如,使用`set()`方法将数据存入缓存,使用`get()`...
首先,你需要下载 Memcached 的源码包或预编译二进制包。在Unix/Linux系统中,通常通过包管理器如`apt-get`(Ubuntu/Debian)或`yum`(CentOS/RHEL)进行安装。例如: ```bash sudo apt-get install memcached ``` ...
2.在终端(也即cmd命令界面)下输入'c:\memcached\memcached.exe -d install'安装 3.再输入:'c:\memcached\memcached.exe -d start'启动。NOTE:以后memcached将作为windows的一个服务每次开机时自动启动。这样...