服务端缓存所提供的最重要功能。其既可以提高单个请求的响应速度,又可以降低服务层及数据库层的压力。
memcache是一个内存缓存系统,通过读取内存中数据和对象减少访问数据库的次数,从而提高效率。memcache是以key-value形式存放的hashmap。
memcache使用模型图(借鉴别的博客):
memcache集群之间是不会通信的(与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),完全依赖于客户端实现。
MemCache一次写缓存的流程:
1、应用程序输入需要写缓存的数据
2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
3、由服务器编号得到MemCache及其的ip地址和端口号
4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
一个大型服务 常常拥有上百个Memcached实例。而在这上百个Memcached实例中所存储的数据则不尽相同。由于这种数据的异构性,我们需要在访问由 Memcached所记录的信息之前决定在该服务端缓存系统中到底由哪个Memcached实例记录了我们所想要访问的数据
如上图所示,用户需要通过一个Memcached客户端来完成对缓存服务所记录信息的访问。该客户端知道服务端缓存系统中所包含的所有 Memcached服务实例。在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如“foo”,以及当前Memcached缓存服务的配置来计算相应的哈希值,以决定到底是哪个Memcached实例记录了用户所需要访问的信息。在决定记录了所需要信息的Memcached实例之后,Memcached客户端将从配置中读取该Memcached服务实例所在地址,并向该Memcached实例发送数据访问请求,以从该 Memcached实例中读取具有键值“foo”的信息。在各个论坛的讨论中,这被称为是Memcached的两阶段哈希(Two-stage hash)。
(一) 集群实现原理:
一致性Hash算法:
具体算法过程为:先构造一个长度为232次方的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将缓存服务器节点放置在这个Hash环上,然后根据需要缓存的数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),然后在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
就如同图上所示,三个Node点分别位于Hash环上的三个位置,然后Key值根据其HashCode,在Hash环上有一个固定位置,位置固定下之后,Key就会顺时针去寻找离它最近的一个Node,把数据存储在这个Node的MemCache服务器中。
(二)MemCache实现原理
首先要说明一点,MemCache的数据存放在内存中,存放在内存中个人认为意味着几点:
1、访问数据的速度比传统的关系型数据库要快,因为Oracle、MySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢
2、MemCache的数据存放在内存中同时意味着只要MemCache重启了,数据就会消失
3、既然MemCache的数据存放在内存中,那么势必受到机器位数的限制,这个之前的文章写过很多次了,32位机器最多只能使用2GB的内存空间,64位机器可以认为没有上限
然后我们来看一下MemCache的原理,MemCache最重要的莫不是内存分配的内容了,MemCache采用的内存分配方式是固定空间分配,还是自己画一张图说明:
这张图片里面涉及了slab_class、slab、page、chunk四个概念,它们之间的关系是:
1、MemCache将内存空间分为一组slab
2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page
3、每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的
4、有相同大小chunk的slab被组织在一起,称为slab_class
MemCache内存分配的方式称为allocator,slab的数量是有限的,几个、十几个或者几十个,这个和启动参数的配置相关。
MemCache中的value过来存放的地方是由value的大小决定的,value总是会被存放到与chunk大小最接近的一个slab中,比如slab[1]的chunk大小为80字节、slab[2]的chunk大小为100字节、slab[3]的chunk大小为128字节(相邻slab内的chunk基本以1.25为比例进行增长,MemCache启动时可以用-f指定这个比例),那么过来一个88字节的value,这个value将被放到2号slab中。放slab的时候,首先slab要申请内存,申请内存是以page为单位的,所以在放入第一个数据的时候,无论大小为多少,都会有1M大小的page被分配给该slab。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk数组,最后从这个chunk数组中选择一个用于存储数据。
如果这个slab中没有chunk可以分配了怎么办,如果MemCache启动没有追加-M(禁止LRU,这种情况下内存不够会报Out Of Memory错误),那么MemCache会把这个slab中最近最少使用的chunk中的数据清理掉,然后放上最新的数据。针对MemCache的内存分配及回收算法,总结三点:
1、MemCache的内存分配chunk里面会有内存浪费,88字节的value分配在128字节(紧接着大的用)的chunk中,就损失了30字节,但是这也避免了管理内存碎片的问题
2、MemCache的LRU算法不是针对全局的,是针对slab的
3、应该可以理解为什么MemCache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存最多就只有1M,所以value大小自然不能大于1M了
再总结MemCache的特性和限制
上面已经对于MemCache做了一个比较详细的解读,这里再次总结MemCache的限制和特性:
1、MemCache中可以保存的item数据量是没有限制的,只要内存足够
2、MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制
3、Key最大为250个字节,超过该长度无法存储
4、单个item最大数据是1MB,超过1MB的数据不予存储
5、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效
6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作
7、MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序
8、MemCache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效。
相关推荐
首先,理解Memcache的基本原理至关重要。Memcache的工作机制是在内存中存储数据,当应用程序需要访问数据时,它会首先检查这些数据是否已经存在于Memcache中。如果存在,就直接从缓存中获取,避免了与数据库的交互,...
学习和使用`Memcache-20151006.doc`和`Memcached 原理和使用详解.pdf`文档,将有助于深入理解Memcache的工作原理和最佳实践。同时,通过`代码.zip`中的示例代码,可以更直观地了解Memcache在实际项目中的应用。
Memcache是一款高性能、分布式的内存对象缓存系统,其核心机制是在内存中维持一个大的哈希表,用于存储各种格式的数据,如图像、视频、文件及数据库查询结果等。它的工作原理是将数据加载到内存中,通过内存直接读取...
- **分布式特性:** Memcache支持多服务器集群,可以通过一致性哈希等算法实现数据的自动分发,以提高系统的可扩展性和容错性。 2. **PHP与Memcache** - **安装:** 在PHP环境中,要使用Memcache,需要先安装PHP的...
- 分布式环境下的Memcache集群配置,以实现更高的可用性和可扩展性。 通过本课件的学习,你将掌握如何在实际项目中部署和利用Memcache提升应用性能。源码部分可以帮助你更好地理解Memcache在实际编程中的应用,...
3. **分布式支持**:Memcache支持多服务器集群,可以将数据分散存储在不同的服务器上,实现负载均衡和数据冗余,增强了系统的可扩展性和容错性。 **二、Memcache的安装与配置** 安装Memcache相对简单,通常可以...
- **分布式**:Memcached支持多服务器环境,数据可以在集群中的任何一台服务器上存储,实现负载均衡和高可用性。 - **内存存储**:所有数据都存储在内存中,因此读取速度非常快,但同时也意味着数据不持久化,断电...
当单个Memcached实例不足以满足需求时,可以通过增加更多的实例来扩展系统,形成一个分布式集群。客户端会根据DHT策略将数据分发到各个节点,确保数据的分散和负载均衡。 综上所述,Memcached以其简单高效的设计,...
- **定义**:当Memcache部署在一个集群中时,一致性哈希算法用于解决数据分布和负载均衡的问题。 - **工作原理**: - 一致性哈希通过计算键值的哈希并将其映射到环形空间上,以确定数据应存储在哪台服务器上。 - ...
使用Memcached作为session存储,可以实现多台服务器间的session共享,这样当用户在集群中的任意一台服务器上登录后,其session信息可以在其他服务器上被识别,保证了用户会话的一致性,提升了应用的可扩展性和可用性...
在本文中,我们将深入探讨如何在Windows环境下安装和使用Memcache,并了解其基本原理和在PHP中的应用。 1. **Win下安装与启动Memcache** 在Windows系统中,你可以通过命令行工具来安装和管理Memcache服务。使用`...
标题“memcache与redis”指出我们将探讨两种流行的键值存储系统——Memcached和Redis。这两种技术都是用于数据缓存和快速访问的高性能解决方案,广泛应用于Web开发和其他需要高效数据处理的场景。 描述部分虽然为空...
标题中的“ehcache-memcache-redis 三大缓存男高音”指的是三种常见的高性能缓存系统:Ehcache、Memcached和Redis。这三种缓存技术在IT领域广泛应用于提高应用程序的性能,通过存储经常访问的数据来减少数据库查询,...
### Memcached原理和使用详解 #### Memcached简介 Memcached是一种高性能、分布式内存对象缓存系统,由LiveJournal的开发团队开发,旨在通过缓存数据库查询结果和其他计算结果来减轻数据库负担,从而提高动态Web...
了解Redis,Memcache等内存数据库及缓存系统的原理及实现 * 熟悉Linux操作系统,对主机、存储、网络有一定的了解,会使用Shell/Perl/Python中的一门脚本语言 职责3 * 负责Hadoop集群的安装部署、维护及调优 * 负责...
3. 熟悉 MySQLDBA 数据库基本原理,深入理解引擎、事务、锁机制等内部工作原理及优化。 4. 熟悉数据库容量规划和分库、分表设计方法,有数据库设计和支持经验,熟悉大数据集群及具有相关维护工作经验。 5. 熟悉 ...
- **分库分表的原理及规则讲解**:了解分库分表的策略。 - **数据库主备及高可用**:实现数据库的主备切换和高可用架构。 **7.10 性能调优专题-JVM调优** - **JVM原理剖析**:深入了解JVM的内部工作原理。 - **jvm...
CouchBase不仅继承了Memcache的所有基本操作,还引入了CouchDB的文档模型和支持视图操作的能力,这使得它成为一款更加全面的数据库解决方案。 **重要问题分析:** - **不健壮性:** 传统的Memcache集群在面对...
下面将详细探讨CDN的基本原理、工作流程以及相关知识点。 1. CDN基本原理:CDN的核心思想是内容分发,它将静态资源(如图片、视频、JavaScript文件、CSS样式表等)复制并存储在多个地理位置的服务器上,当用户请求...
* 缓存数据库 Memcache 的集群模式和一致性 Hash * Redis 的基本数据类型 网络模块 * 一个 URL 请求的过程 * HTTP 状态码的意义(502、406、302) * 三次握手和四次挥手 * Vi 编辑器的两种模式和跳转到最后一行 * ...