Memcached 原理剖析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
余问题都解决了,空间利用率会大大提升。
修改 slabs_clsid 函数,让它直接返回一个定值(比如 1 )
unsigned int slabs_clsid(size_t size) {return 1;}
修改slabs_init函数,去掉循环创建所有classid属性的部分,直接添加
slabclass[1]:
高
支持。持久化到本地硬盘,生成一 个.data和.index文件。Cache初始化 时会自动查找这两个文件,将数据放 入cache
高于memcache
可通过客户端实现
支持
缓存在memcached server向系统申请的内存中 LRU
可以缓存在内存(jvm)中,也可以缓存 在 硬盘。通过CacheManager管理 cache.多个CacheManager可管理多个 cache
个slab大小正好等于chunk长度的整数倍,这样一个slab就可以正好划分成n个
chunk。这个数值应该比较接近1MB,过大的话同样会造成冗余,过小的话会
造成次数过多的alloc,根据chunk长度为200,选择1000000作为
POWER_BLOCK的值,这样一个slab就是100万字节,不是1048576。三个冗
19
Memcache安装和使用:
Memcache windows安装
1.下载Memcache的window稳定版,解压到某个盘下 面。 2.Cmd找到解压目录,输入memcached.exe –d insatll安装为windows服务.(如果是win7,要以 administrator方式启动cmd). 3.再输入memcached.exe –d start启动。
Memcache可以对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是 在内存中开辟一块空间,然后建立一个HashTable,Memcache自管理这些 HashTable. Memcache的官方网站:http://www.danga.com/memcached/ 为什么会有Memcache和Memcached两种名称? 其实Memcache是这个项目的名称,而Memcached是它服务器端的主程序文 件名。
LRU,FIFO,LFU
功能不完善,相对于ehcache效率低
简单,灵活,所有支持socket的语言都可以编写他的 客户端
只适用于java体系,只能编写java客 户端
效率高,功能强大
4
Memcache原理分析
Memcache工作方式?
5
Memcache原理分析
6
Memcache原理分析
自主的内存存储处理
Slab Allocation的原理相当简单。 将 分配的内存分割成各种尺寸的块 (chunk),并把尺寸相同的块分成Байду номын сангаас (chunk的集合)
8
Memcache原理分析
数据存储方式:Slab Allocation
Slab Classes 分配图
Page:分配给Slab的内存空间,默认是 1MB。分配给Slab之后根据slab的大小 切分成chunk。
3
Memcache, EhCache的比较
项目
分布式
Memcache
不完全,集群默认不实现
EhCache
支持
集群 持久化
效率 容灾 缓存数据方式
缓存过期移除策略 缺点 优点
可通过客户端实现
支持
可通过第三方应用实现,如sina研发的memcachedb, 将cache的数据保存到Berkerly DB
//得出的结果是1,那么对应的机器就是 node[id] == node[1]
13
Memcache原理分析:
基于客户端的Memcached分布式
写入操作
读取操作
14
Memcache原理分析:
Memcache的理论参数计算方式
常量REALTIME_MAXDELTA 60*60*24*30 最大30天的过期时间 conn_init()中的freetotal(=200) 最大同时连接数 常量KEY_MAX_LENGTH 250 最大键长 settings.factor(=1.25) factor将影响chunk的步进大小 settings.maxconns(=1024) 最大软连接 settings.chunk_size(=48) 一个保守估计的key+value长度,用来生成id1中的chunk长度(1.2)。id1的 chunk长度等于这个数值加上item结构体的长度(32),即默认的80字节。 常量POWER_SMALLEST 1 最小classid(1.2) 常量POWER_LARGEST 200 最大classid(1.2)
Slab Alloction 缺点
这个问题就是,由于分配的是特定长度的内存,因此无法有效利用 分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩 余的28字节就浪费了。
10
Memcache原理分析:
数据过期方式
• Lazy Expiration memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过 期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费 CPU时间。
16
Memcache原理分析:
Memcache的定长优化
根据上面几节的描述,多少对memcached有了一个比较深入的认识。在深入认 识的基础上才好对它进行优化。 Memcached本身是为变长数据设计的,根据数据特性,可以说它是“面向大众” 的设计,但是很多时候,我们的数据并不是这样的“普遍”,典型的情况中, 一种是非均匀分布,即数据长度集中在几个区域内(如保存用户 Session); 另一种更极端的状态是等长数据(如定长键值,定长数据,多见于访问、在线 统计或执行锁)。 这里主要研究一下定长数据的优化方案(1.2),集中分布的变长数据仅供参 考,实现起来也很容易。 解决定长数据,首先需要解决的是slab的分配问题,第一个需要确认的是我们 不需要那么多不同chunk长度的slab,为了最大限度地利用资源,最好chunk和 item等长,所以首先要计算item长度。 在之前已经有了计算item长度的算法,需要注意的是,除了字符串长度外,还 要加上item结构的长度32字节。 假设我们已经计算出需要保存200字节的等长数据。 接下来是要修改slab的classid和chunk长度的关系。在原始版本中,chunk长度 和classid是有对应关系的,现在如果把所有的chunk都定为200个字节,那么这 个关系就不存在了,我们需要重新确定这二者的关系。一种方法是,整个存储 结构只使用一个固定的id,即只使用199个槽中的1个,在这种条件下,就一定 17
2
Memcache是什么:
Memcache是国外社区网站 LiveJournal 的开发团队开发的高性能的分布式内 存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访 问次数,以提高动态Web应用的速度、提高可扩展性。目前全世界不少人使用 这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
15
Memcache原理分析:
常量POWER_BLOCK 1048576 默认slab大小 常量CHUNK_ALIGN_BYTES (sizeof(void *)) 保证chunk大小是这个数值的整数倍,防止越界(void *的长度在不同系统上不 一样,在标准32位系统上是4) 常量ITEM_UPDATE_INTERVAL 60 队列刷新间隔 常量LARGEST_ID 255 最大item链表数(这个值不能比最大的classid小) 变量hashpower(在1.1中是常量HASHPOWER) 决定hashtable的大小 根据上面介绍的内容及参数设定,可以计算出的一些结果: 1、在memcached中可以保存的item个数是没有软件上限的,之前我的100万的 说法是错误的。 2、假设NewHash算法碰撞均匀,查找item的循环次数是item总数除以 hashtable大小(由hashpower决定),是线性的。 3、Memcached限制了可以接受的最大item是1MB,大于1MB的数据不予理会。 4、Memcached的空间利用率和数据特性有很大的关系,又与 DONT_PREALLOC_SLABS常量有关。 在最差情况下,有198个slab会被浪费 (所有item都集中在一个slab中,199个id全部分配满)。
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
memcached根据收到的数据的大小,选 择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的 列表,根据该列表选择chunk,然后将 数据缓存于其中。
9
Memcache原理分析:
数据存储方式:Slab Allocation
一个id,在数据量非常大的情况下,slab链会很长(因为所有数据都挤在一条
链上了),遍历起来的代价比较高。
前面介绍了三种空间冗余,设置chunk长度等于item长度,解决了第一种空间
浪费问题,不预申请空间解决了第二种空间浪费问题,那么对于第一种问题
(slab内剩余)如何解决呢,这就需要修改POWER_BLOCK常量,使得每一
CODE:
slabclass[1].size = 200;
//每chunk200字节
slabclass[1].perslab = 5000; //1000000/200
18
Memcache安装、配置和使用:
• Memcache 安装 • Memcache 配置 • Memcache 结合java客户端的使用
hash += c; } return hash % serverTotal; }
//服务器列表 node[0] => 192.168.0.1:11211 node[1] => 192.168.0.2:11211 node[2] => 192.168.0.3:11211
//获取key是tokyo的节点ID(服务器ID) int id = getServerId("test", 3);
Memcache原理分析:
要定义DONT_PREALLOC_SLABS来避免另外的预分配浪费。另一种方法是
建立一个hash关系,来从item确定classid,不能使用长度来做键,可以使用key
的NewHash结果等不定数据,或者直接根据key来做hash(定长数据的key也一
定等长)。这里简单起见,选择第一种方法,这种方法的不足之处在于只使用
11
Memcache原理分析:
基于客户端的Memcached分布式
12
Memcache原理分析:
基于客户端的Memcached分布式
//按照Key值,获取一个服务器ID int getServerId(char *key, int serverTotal) {
int c, hash = 0; while (c = *key++) {
Memcached 入门
作者:
2009-01
Tech Talk 目录索引
Memcache是什么 Memcache,ehcache的比较 Memcache原理分析 Memcache安装和基本配置 Memcache的在大型网站中的使用策略 Memcache的一些经验和技巧 Memcache一致性算法(consistent hasing)
• 数据存储方式:Slab Allocation • 数据过期方式:Lazy Expiration + LRU
7
Memcache原理分析
数据存储方式:Slab Allocation
Slab Alloction 构造图
Slab Allocator的基本原理是按照预先 规定的大小,将分配的内存分割成特定 长度的块,以完全解决内存碎片问题。
• LRU memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不 足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义, 这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法 从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配 给新的记录。从缓存的实用角度来看,该模型十分理想。