虽然之前项目中一直使用memcached缓存,但还没有深入了解一下,最近看了idv2的memcached全面剖析系列文章,在此总结一下,算是读书笔记吧~
参考链接:http://tech.idv2.com/2008/07/10/memcached-001/
http://tech.idv2.com/2008/07/11/memcached-002/
http://tech.idv2.com/2008/07/16/memcached-003/
http://tech.idv2.com/2008/07/24/memcached-004/
http://tech.idv2.com/2008/07/31/memcached-005/
/************
*******
*** memcached 基础 ****
*******
***********/
memcached 是什么?
是一种高性能的分布式内存缓存服务器。
使用环境:随着数据量的增大、访问的集中,就会出现数据库管理系统的负担加重、数据库响应恶化、 网站显示延迟等重大影响;
使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态web的访问速度,提高可扩展性。
memcached 特性:
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
1、协议简单:使用简单的基于文本行的协议;
2、基于libevent的事件处理:libevent是一个程序库,它将linux的epoll、BSD类操作系统的kqueue等事件处理功能,封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
3、内置内存存储方式:为了提高性能,memcached将数据存储在内置的内存存储空间中。因此,重启memcached、重启操作系统,会导致全部数据消失。另外存储容量达到指定值之后,就基于LRU算法自动删除最近未使用缓存记录。
memcached本身就是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
4、memcached不互相通信的分布式:尽管是分布式缓存服务器,但服务端并互不通信,无分布式功能。分布式完全取决于客户端的实现。
/************
*******
*** memcached 内存存储 ****
*******
***********/
Slab Allocation 机制:
整理内存以便重复使用。
memcached默认情况下采用了slab allocation机制,在该机制以前,内存的分配时通过对所有的记录简单的进行malloc(申请) 和free(释放)来进行的。
但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况,会导致操作系统比memcached进程本身还要慢。slab allocation机制因此应运而生。
Slab Allocation基本原理:按照预先规定的大小,将分配的内存分割成特定的块(trunk),已完全解决内存碎片的问题。还有重复使用已分配内存的目的,也就是说,分配的内存不会释放,而是重复利用。
Slab Allocation 主要术语:
page:分配给slab的内存空间,默认是1m,分配给slab之后根据slab的大小切割成块(trunk)。
trunk:用于缓存记录的内存空间。
slab class:特定大小的trunk数组。
Alab Allocation 中缓存记录的原理:
针对客户端发送的数据,选择slab并缓存到chunk中。
memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk, 然后将数据缓存于其中。
Slab Allocation 的缺点:
Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。
这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。 例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。
对于该问题目前还没有完美的解决方案,但有比较有效的解决方案:
如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下, 只要使用适合数据大小的组的列表,就可以减少浪费。
使用Growth Factor进行调优:
memcached在启动时指定 Growth Factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异,默认值为1.25。
在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。
slab class 1: chunk size 128 perslab 8192
slab class 2: chunk size 256 perslab 4096
slab class 3: chunk size 512 perslab 2048
slab class 4: chunk size 1024 perslab 1024
slab class 5: chunk size 2048 perslab 512
slab class 6: chunk size 4096 perslab 256
slab class 7: chunk size 8192 perslab 128
slab class 8: chunk size 16384 perslab 64
slab class 9: chunk size 32768 perslab 32
slab class 10: chunk size 65536 perslab 16
slab class 11: chunk size 131072 perslab 8
slab class 12: chunk size 262144 perslab 4
slab class 13: chunk size 524288 perslab 2
可见,从128字节的组开始,组的大小依次增大为原来的2倍。
这样设置的问题是,slab之间的差别比较大,有些情况下就相当浪费内存。
因此,为尽量减少内存浪费,两年前追加了growth factor这个选项。
slab class 1: chunk size 88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
slab class 4: chunk size 184 perslab 5698
slab class 5: chunk size 232 perslab 4519
slab class 6: chunk size 296 perslab 3542
slab class 7: chunk size 376 perslab 2788
slab class 8: chunk size 472 perslab 2221
slab class 9: chunk size 592 perslab 1771
slab class 10: chunk size 744 perslab 1409
可见,组间差距比因子为2时小得多,更适合缓存几百字节的记录。
将memcached引入产品,或是直接使用默认值进行部署时,
最好是重新计算一下数据的预期平均长度,调整growth factor,
以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。
/************
*******
*** memcached 删除机制 ****
*******
***********/
memcached是缓存,所以数据不会永久保存在服务器上,这是向系统中引入memcached的前提。
数据不会真正从memcached中消失
memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(即:invisible,透明), 其存储空间即可重复使用。
Lazy Expiration 惰性过期
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU原理--least recently used
memcached 会优先使用已过期的记录空间,即使如此,也会发生追加新记录时空间不足的情况(无法从slab class获取新空间),此时就依据LRU原理,从最近未被使用的记录中搜索,并将空间分配给新的记录。
缓存使用角度看,十分理想,不过有些情况下反倒会造成麻烦,通过-M可以禁止LRU
$ memcached -M -m 1024
-M启动后,内存使用不足时,memcached会返回错误,
memcached毕竟不是存储器,而是缓存,所以推荐使用LRU!
- 大小: 11 KB
- 大小: 28.2 KB
- 大小: 11.7 KB
- 大小: 23.4 KB
- 大小: 7 KB
分享到:
相关推荐
【标题】"memcached-笔记资料"涉及到的核心知识点是分布式内存缓存系统——Memcached,它是一个高性能、轻量级的缓存解决方案,主要用于减轻数据库的负载,提高Web应用的性能。 【描述】"memcached-笔记资料"暗示了...
Memcached是一种广泛使用的分布式内存缓存系统,它能够有效地缓解数据库的负载,提高Web应用的性能。本篇学习笔记将重点介绍如何在Java环境中使用gwhalin提供的Memcached客户端进行开发。gwhalin的Memcached Java...
标题 "memcached-笔记资料.rar" 暗示了这个压缩包包含的是关于 memcached 的学习资料,这是一款广泛使用的分布式内存对象缓存系统。它主要用于减轻数据库的负载,通过在内存中存储常用数据,提高应用程序的响应速度...
memcached 源码剖析笔记和源码。 Memcached 是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于过减轻数据库负载来使动态 Web 应用程序提速。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
Memcached采用了一个简单的键值存储模型,即每个存储的对象都关联着一个唯一的键。这种方式使得开发者能够快速地存取数据,而无需复杂的查询逻辑。此外,Memcached支持多种数据类型,包括但不限于字符串、对象等。 ...
Memcached 是一个自由、开源、高性能、分布式内存对象缓存系统,旨在通过减轻数据库负载来使动态 Web 应用程序提速。下面是 Memcached 源码剖析笔记的知识点总结: 1. 背景 Memcached 的出现是为了解决动态 Web ...
1. 连接Memcached服务器:使用`new Memcached()`创建实例,然后调用`addServer()`方法添加服务器地址和端口。 2. 存储数据:使用`set()`方法可以将键值对存储到缓存中,例如`$memcached->set('key', 'value', $...
**Memcached源码剖析笔记** **1. 背景** Memcached是一个高效且流行的分布式内存对象缓存系统,主要用于动态Web应用。它的主要目的是通过将数据和对象存储在内存中来减少对数据库的访问频率,从而提升应用程序的...
《Memcached源码剖析笔记》是一份深入解析Memcached内部工作原理和技术细节的文档,旨在帮助读者理解这个高性能分布式内存对象缓存系统的设计与实现。Memcached被广泛应用于动态Web应用程序,通过缓存数据和对象,...
1. 安装memcached服务端: - 在Linux环境下,可以使用yum命令快速安装memcached服务端。具体命令为`yum install memcached -y`,其中-y表示自动确认安装,无需手动输入yes确认。 2. 下载libmemcached: - 由于...
**Memcached笔记** Memcached是一种高性能的分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。本文将深入探讨Memcached的基础知识、工作原理、安装与配置,以及如何在...
memcached笔记资料,配套视频:https://www.bilibili.com/list/474327672?sid=4486766&spm_id_from=333.999.0.0&desc=1
Memcached是一种分布式内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的性能。由于是64位版本,这意味着它可以利用64位系统的内存优势,处理更大的数据量。 **Memcached简介** Memcached是一款高性能、轻...