转:http://blog.sina.com.cn/s/blog_493a845501013ei0.html
分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。
原文:http://wenku.baidu.com/view/8686d46c7e21af45b307a8c3.html
什么是Memcached
许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库 响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库查询结果,减少数据库的访问次 数,以提高动态Web 应用的速度、提高扩展性。如图:
Memcached作为高速运行的分布式缓存服务器具有以下特点。
- 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。
- 基于libevent的事件处理:libevent是个程序库,他将Linux 的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
- 内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后memcached回自动删除不适用的缓存。
- Memcached不互通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。
Memcached的内存管理
最近的memcached默认情况下采用了名为Slab Allocatoion的机制分配,管理内存。在改机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是这中方式会导致内存碎片,加重操作系统内存管理器的负担。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。Slab Allocation 的原理相当简单。将分配的内存分割成各种尺寸的块(chucnk),并把尺寸相同的块分成组(chucnk的集合)如图:
而且slab allocator 还有重复使用已分配内存的目的。也就是说,分配到的内存不会释放,而是重复利用。
Slab Allocation 的主要术语
- Page :分配给Slab 的内存空间,默认是1MB。分配给Slab 之后根据slab 的大小切分成chunk.
- Chunk : 用于缓存记录的内存空间。
- Slab Class:特定大小的chunk 的组。
在Slab 中缓存记录的原理
Memcached根据收到的数据的大小,选择最合适数据大小的Slab (图2) memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
Memcached在数据删除方面有效里利用资源
Memcached删除数据时数据不会真正从memcached中消失。Memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible 透明),其存储空间即可重复使用。
Lazy Expriationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术称为lazy expiration.因此memcached不会再过期监视上耗费CPU时间。
对于缓存存储容量满的情况下的删除需要考虑多种机制,一方面是按队列机制,一方面应该对应缓存对象本身的优先级,根据缓存对象的优先级进行对象的删除。
LRU:从缓存中有效删除数据的原理
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。此时就要使用名为Least Recently Used (LRU)机制来分配空间。这就是删除最少使用的记录的机制。因此当memcached的内存空间不足时(无法从slab class)获取到新空间时,就从最近未使用的记录中搜索,并将空间分配给新的记录。
Memcached分布式
Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能。Memcached的分布式完全是有客户端实现的。现在我们就看一下memcached是怎么实现分布式缓存的。
例如下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。
首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。
接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。
这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。
相关推荐
Memcached源码分析之内存管理Memcached源码分析之内存管理
### Memcached内存分析、调优、集群:深入理解与实践 #### 1. Memcached背景与概述 Memcached是一款高性能的分布式内存缓存服务器,它最初由LiveJournal的运营人员开发,现已成为开源社区中不可或缺的一部分。其...
计算机后端-PHP视频教程. Memcached12 memcached内存管理机制.wmv
### Memcached内存分析、调优、集群 #### 1. Memcached背景 Memcached是一款高性能的分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用的响应速度。它通过在内存中缓存数据和对象来减少读取数据库...
SLAB机制是Memcached内存管理的关键组成部分,它通过一种特殊的缓存机制来存储item数据。这种机制能够有效地提高内存利用率并减少内存碎片,从而提高系统的整体性能。 **SLAB机制概述:** - **SLAB(Class)定义**...
- **内存管理**:内存是Memcached存储数据的主要场所,它采用 slab 分配器,将内存划分为不同大小的块(slabs),每个块又包含多个固定大小的项(items)。这种设计减少了内存碎片,提高了内存利用率。 - **键值对...
MSM(Memcached_Session_Manager)是一个基于Java的Memcached会话管理器,它允许我们将Web应用的session数据存储在Memcached服务器上,而不是传统的保存在服务器的内存中或者硬盘上的session文件。这样,即使服务器...
【Memcached内存分析】 Memcached是一款高性能的分布式内存缓存系统,由LiveJournal的运营团队开发,被广泛应用于包括Facebook、mixi、Digg、Wikipedia等在内的大型网站。其设计目标是减轻数据库的压力,通过将常用...
`Tomcat`是一个流行的开源Java Servlet容器,而`Memcached`则是一个分布式内存对象缓存系统,常用于减轻数据库负载,提高应用性能。本篇文章将详细介绍如何使用`Tomcat`结合`Memcached`来实现高效的Session管理。 ...
### Memcached内存分析、调优、集群 #### 一、Memcached背景介绍 Memcached是一款高性能的分布式内存对象缓存系统,它通过减轻数据库负担来加速动态Web应用程序的速度。最初由LiveJournal的开发者Brad Fitzpatrick...
在Memcached中,内存管理是至关重要的,因为它直接影响到服务的性能和效率。memcached采用了一种特殊的内存分配策略,名为Slab Allocation,以避免频繁的内存碎片和提高内存利用率。 1. Slab Allocation原理: ...
2. **性能监控**:memadmin可以实时显示memcached服务器的运行状态,包括命中率、内存使用情况、连接数等关键指标,帮助管理员及时发现和解决问题。 3. **统计分析**:提供统计报告,包括访问频率、缓存命中率等,...
总的来说,Memcached的SLAB机制是其高效运行的关键,它通过精细的内存管理,确保了在高并发场景下的快速响应和低延迟。理解和掌握这一机制对于优化Memcached的性能以及在实际应用中合理配置参数至关重要。
Memcached的源代码简洁明了,对于理解分布式缓存的工作原理和内存管理有很好的学习价值。通过阅读源码,可以深入了解其内部机制,如哈希表的实现、内存分配策略、网络通信细节等。 总结来说,Memcached是一个高效的...
在大多数Linux发行版中,可以使用包管理器安装Memcached。例如,在Ubuntu上,可以执行`sudo apt-get install memcached`。安装完成后,通过修改配置文件(通常是`/etc/memcached.conf`)设置端口、最大内存等参数,...
4. **内存管理**:memcached管理内存空间,当内存不足时,会使用LRU(Least Recently Used)策略自动删除最近最少使用的数据。 5. **非持久化存储**:由于数据存储在内存中,一旦服务器重启,所有数据将丢失。因此,...
Memcached是一种分布式内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的性能。由于是64位版本,这意味着它可以利用64位系统的内存优势,处理更大的数据量。 **Memcached简介** Memcached是一款高性能、轻...
而“C#版Memcached监控管理工具”则是针对这一内存缓存系统开发的一款专用工具,主要目的是为了帮助开发者更好地管理和监控Memcached服务的运行状态。 【描述】: 虽然描述为空,但我们可以推测这个工具可能是由C#...