`
suhuanzheng7784877
  • 浏览: 698460 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47587
社区版块
存档分类
最新评论

Memcache工作原理总结

阅读更多

 

<!--[if !supportLists]-->1.  <!--[endif]-->分片原理

 

咱们废话话不多说了,直接看Memcache的原理。首先memcache解决的最大的一个问题就是内存多次读取的内存碎片问题。内存碎片分为内存内部碎片和内存外部碎片。一般是指在外部碎片中出现了不连续的细小内存片段,不能够被进程利用。因为不连续,不能组合成大而的连续空间,导致这部分空间很可惜的浪费了。内存碎片是因为在分配一个内存块后,使之空闲,但不将空闲内存归还给最大内存块而产生的。

 

那么memcache启动进程的时候就按照预先设定好的大小(默认是64mb)相内存开辟出一段连续的内存空间,之后再将这段内存空间分成不同的片段。

 

相信下面的图大家都见过了

 



 

Memcache单进程最大可开的内存是2GB,如果想缓存更多的数据,建议还是开辟更多的memcache进程(不同端口)或者使用分布式memcache进行缓存,将数据缓存到不同的物理机或者虚拟机上。

 

Memcache进程启动,在内存开辟了连续的区域。咱们用上面的图形来举例,这段连续的区域就好像上面的slab1+slab2+slab3+……+slab(n).分配区域相同的构成了slab(分片组)。Slab下面可不直接就是存储区域片(就是图中的chunks)了。而是page,如果一个新的缓存数据要被存放,memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请。slab申请内存时以page为单位,所以在放入第一个数据,无论大小为多少,都会有1M大小的page被分配给该slab。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,在从这个chunk数组中选择一个用于存储数据。(http://blog.csdn.net/21aspnet/article/details/7022827)。在Page中才是一个个小存储单元——chunks,一个page默认1mb,那么可以放多少个88字节单位的chunks呢?1024*1024/88约等于11915个。如果放入记录是一个100字节的数据,那么在88字节的chunks112字节的chunks中如何调配呢。答案当然是紧着大的用,不可能将请求过来的数据再做个分解、分离存储、合并读取吧。这样也就带来了一个小问题,还是有空间浪费掉了。112-100=12字节,这12字节就浪费了。

 

在缓存的清除方面,memcache是不释放已分配内存。当已分配的内存所在的记录失效后,这段以往的内存空间,memcache自然会重复利用起来。至于过期的方式,也是采取get到此段内存数据的时候采取查询时间戳,看是否已经超时失效。基本不会有其他线程干预数据的生命周期。至于清空的策略等同于ehcache的默认策略——最近很少使用清空策略——也就是英文常用的LRU——Least Recently Used

 

memcache鉴定内存不足是在什么情况下呢:无法从slab里面获取新的存储单元了。这个对内存十分贪婪的东东。基本服务器都得是2~4GB以上方能吃得消(非时效性,或者说时效性较低的数据)。

 

Memcache借助了操作系统的libevent工具做高效的读写。libevent是个程序库,它将LinuxepollBSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在LinuxBSDSolaris等操作系统上发挥其高性能。Memcache号称可以接受任意数量的连接请求。事实真的是这样吗?

 

<!--[if !supportLists]-->1.  <!--[endif]-->存储过程分析

假设我们现在往memcache中存储一个缓存记录,首先在使用memcache客户端程序的时候要制定一个初始化的服务机器路由表,比如Java的客户端程序

cachedClient = new MemCachedClient();  
//获取连接池实例  
SockIOPool pool = SockIOPool.getInstance();  
  
//设置缓存服务器地址,可以设置多个实现分布式缓存  
pool.setServers(new String[]{"127.0.0.1:11211","192.176.17.90:11211"});

 那么在做存储的时候memcache客户端程序会hash出一个码,之后再根据路由表去将请求转发给memcache服务端,也就是说memcache的客户端程序相当于做了一个类似负载均衡的功能。下面这个图也是大家以前看过的

 



 

 

memcacheserver上面的进程仅仅负责监听服务和接受请求、存储数据的作用。分发不归他管。所以这么看的话,散列到每台memcache服务机器,让每台机器分布存储得均匀是客户端代码实现的一个难点。这个时侯Hash散列算法就显得格外重要了吧。

 

<!--[if !supportLists]-->1.  <!--[endif]-->读取过程分析

 

理解了memcache的存储就不难理解memcache的读取缓存的过程了。在读取的时候也是根据key算出一个hash,之后在算出指定的路由物理机位置,再将请求分发到服务机上。



 

 

memcache分布式读写的存储方式有利有弊。如果node2宕机了,那么node2的缓存数据就没了,那么还得先从数据库load出来数据,重新根据路由表(此时只有node1node3),重新请求到一个缓存物理机上,在写到重定向的缓存机器中。灾难恢复已经实现得较为完备。弊端就是维护这么一个高可用缓存,成本有点儿大了。为了存储更多的数据,这样做是否利大于弊,还是得看具体的应用场景再定。

 

<!--[if !supportLists]-->1.  <!--[endif]-->ehcache的争论

 

Ehcache的争论之前就说过了,总是在性能上来说这两个的性能如何。还有大家在网上常见的一个列表进行了比较。笔者觉得,这两个最大的差异是原理的差异决定了应用场景的差异。比如做单点应用缓存的时候,就可以使用ehcache直接向本地内存进行缓存的读写。而做集群缓存的时候一般是借由一个集中式管理server来做缓存,既然是集中式server就少不了网络传输了,这个时侯memcache较为适合。不是说ehcache不能做集群式的缓存,而是做了集群的缓存的代价(RMIJMSJGroups)、网络资源的占用确实比memcache高一些。至于内存的读写操作效率,这个不太好说。Ehcachejava的随机读写类操作二进制的bufferMemcache底层是基于libevent程序库的C服务。这个相信效率都差不多。关键的消耗还是在网络IO资源上。

 

  • 大小: 19.5 KB
  • 大小: 13.8 KB
  • 大小: 19.5 KB
分享到:
评论

相关推荐

    【汇总】Memcache

    总结来说,Memcache是Web应用提升性能的重要工具,通过理解和掌握其核心原理和使用方法,我们可以更好地利用它来优化我们的系统,提高用户体验。同时,对于有兴趣的开发者,源码分析和工具使用将进一步加深对...

    Memcache缓存技术,Memcache配置说明及其文件,PHP5.2.6版本内存缓存技术配置

    Memcache的工作机制是在内存中存储数据,当应用程序需要访问数据时,它会首先检查这些数据是否已经存在于Memcache中。如果存在,就直接从缓存中获取,避免了与数据库的交互,从而显著提高了数据读取速度。Memcache...

    memcache相关下载

    **标题与描述解析** 标题“memcache相关下载”指出我们关注的是一个与memcache相关的资源集合,特别是针对WAMP(Windows、Apache、...理解memcache的工作原理以及如何在PHP中使用它,是提升Web开发技能的重要一环。

    memcache-2.2.6.tgz

    Memcache 是一个高性能的分布式内存对象缓存系统,它广泛应用于Web应用中,用来减轻数据库负载,提高数据读取速度。这个"memcache-2.2.6.tgz"文件...理解Memcache的工作原理和使用方法,对于优化Web应用性能至关重要。

    php之Memcache的使用

    学习和使用`Memcache-20151006.doc`和`Memcached 原理和使用详解.pdf`文档,将有助于深入理解Memcache的工作原理和最佳实践。同时,通过`代码.zip`中的示例代码,可以更直观地了解Memcache在实际项目中的应用。

    memcache分布式缓存的使用

    **Memcache的工作原理** Memcache基于内存存储,将数据以键值对的形式存储在内存中,提供快速的查找和访问。当应用需要数据时,首先尝试从Memcache中获取,如果存在则直接返回,不存在则从数据库中读取并存入...

    php_memcache.dll

    《深入理解PHP Memcache扩展与应用》 PHP Memcache是一个广泛使用的PHP扩展,它提供了对Memcached内存存储系统的接口,从而让PHP应用...在实际开发中,理解其工作原理和使用方法,能有效优化应用程序并提高用户体验。

    Memcache 全面剖析,Memcache 教程

    **一、Memcache 的工作原理** 1. **内存存储**:Memcache 将数据存储在服务器的内存中,由于内存的读写速度远高于硬盘,因此可以显著提升数据访问效率。 2. **键值对存储**:Memcache 使用键值对(Key-Value)的...

    memcache简介、安装 and in cakephp

    其工作原理是将数据存储在内存中,以便快速检索,从而减少了对数据库的直接访问,提高了整体应用的响应速度。 Memcache最初由Danga Interactive公司开发,现在已经成为开源项目,被许多大型网站如Facebook、Twitter...

    php_memcache-5.2 5.3 5.4

    《PHP与Memcached扩展:深入理解php_memcache的使用与优化》 ...本文将详细探讨PHP与Memcached的集成扩展...了解其工作原理、使用方法以及常见优化策略,对于任何使用PHP进行Web开发的程序员来说都是必不可少的知识点。

    memcache服务器监控

    1. **源码分析**:可能深入到Memcache的源代码级别,理解其内部工作原理,帮助优化配置或自定义监控脚本。 2. **工具推荐**:介绍一些用于监控Memcache的开源工具,如`memcached-top`,一个实时显示Memcache统计信息...

    缓存框架-Memcache的例子

    在本文中,我们将深入探讨Memcache的工作原理、优势以及如何在实际项目中使用它。 一、Memcache简介 Memcache是由Danga Interactive开发的一个高性能、分布式内存对象缓存系统,适用于动态Web应用以减轻数据库负载...

    Java开发中的Memcache原理及实现

    本文将深入探讨Memcached的工作原理,以及如何在Java环境中实现和应用Memcached。 一、Memcached的工作原理 1. 分布式存储:Memcached采用分布式哈希(Distributed Hash Table, DHT)策略,将数据分散存储在多台...

    memcache-3.0.4.tgz

    Memcache的工作原理基于键值对(key-value pairs)存储模式。当应用需要存储数据时,它将数据与一个唯一的键关联,并将这对信息放入内存中。随后,当应用需要再次访问该数据时,只需要提供相同的键,Memcache就能...

    memcache的源代码.zip感觉自己水平高的,可以下载研究研究

    源代码分析是理解任何软件工作原理的关键步骤。对于Memcached来说,研究源代码可以帮助我们深入理解其内部机制,包括: 1. **数据结构与算法**:Memcached如何高效地存储和检索键值对,可能涉及哈希表、LRU(Least ...

    5.1 Memcache部署和使用-带书签-201809301

    Memcache的工作原理是通过缓存数据库查询结果,减少对数据库的直接访问,从而提高应用性能。 ### 1.1 Memcache简介 Memcached最初由Danga Interactive公司开发,后来成为开源项目。它是一个基于内存的缓存服务,...

    php-memcache

    Memcache的工作机制是基于键值对存储,允许开发者将数据存储在内存中,通过键来快速访问。由于内存的读写速度远超硬盘,所以Memcache能显著提升数据读取效率。它支持多服务器环境,可以实现数据的分布式存储,从而...

Global site tag (gtag.js) - Google Analytics