详解MemCached原理
memcached是一个高性能的分布式内存缓存服务器,memcached在Linux上可以通过yum命令安装,这样方便很多,在生产环境下建议用Linux系统,memcached使用libevent这个库在Linux系统上才能发挥它的高性能。它的分布式其实在服务端是不具有分布式的特征的,是依靠客户端的分布式算法进行了分布式,memcached是一个纯内存型的数据库,这样在读写速度上相对来说比较快。
memcached的内存分配是预先分配内存,常规的程序使用内存无非是两种,一种是预先分配,一种是动态分配。动态分配从效率的角度来讲相对来说要慢点,因为它需要实时的去分配内存使用,但是这种方式的好处就是可以节约内存使用空间;memcached采用的是预先分配的原则,这种方式是拿空间换时间的方式来提高它的速度,这种方式会造成不能很高效的利用内存空间,但是memcached采用了Slab Allocation机制来解决内存碎片的问题,Slab Allocation的基本原理就是按照预先规定的大小,将分配的内存分割成特定长度的块,并把尺寸相同的块分成组(chunk的集合),借用一下网上的图:

memcached会针对客户端发送的数据选择slab并缓存到chunk中,这样就有一个弊端那就是比如要缓存的数据大小是50个字节,如果被分配到如上图88字节的chunk中的时候就造成了33个字节的浪费,虽然在内存中不会存在碎片,但是也造成了内存的浪费,这也是我上面说的拿空间换时间的原因,不过memcached对于分配到的内存不会释放,而是重复利用。默认情况下如下图chunk是1.25倍的增加的,当然也可以自己通过-f设置,这种内部的分割算法可以参看源码下的slabs.c文件。

memcached本身内部不会监视记录是否过期,而是当get时依靠记录的过期时间检查是否过期,这也是memcached的一种惰性过期机制。默认情况下memcached内部也维护着一套LRU置换算法,当设定的内存满的时候,会进行最近很少使用的数据置换出去从而分配空间,所以对于提升memcached命中率的问题主要还是一是根据业务存放的value值来调整好chunk的大小以达到最大效率的利用内存;二是扩大内存保证所有缓存的数据不被置换出去。
对于memcached的分布式完全就是依靠客户端的一致哈希算法来达到分布式的存储,因为本身各个memcached的服务器之间没办法通信,并不存在副本集或者主从的概念,它的分布式算法主要是先求出每一个memcached的服务器节点的哈希值,并将它们分配到2的32次方的圆上,然后根据存储的key的哈希值来映射到这个圆上,属于哪个区间顺时针找到的节点就存到这个服务器节点上,大致借用图表示如下图:

然而当添加新的memcached节点的时候必然会打乱现有这个圆的结构,这时候是没办法完全保证你以前的key依然会存在之前的节点上,但是这种结构却是能保证在添加缓存服务器的时候把损失降到最小,受结构调整后key不能命中的只有在这个圆上新增的服务器节点逆时针的第一台服务器上,其他的是不受影响的,借用图如下:

memcached和redis一样内部的存储都是key/Value的形式,正是这种哈希表数据结构保证了在内存中查找的时间的复杂度为O(1),整体上memcached的高性能这两个哈希结构起了很大的作用,当然还有memcached的多路复用I/O模型也在高并发下起到了很大的作用。另外memcached的内部操作还具有CAS原子操作,这种利用CPU指令集的操作来保证在单个节点下数据的一致性,效率相对来说比加锁要高很多。
其实相比来说很多时候如果做缓存的话我可能会选redis,不过memcached也有它的优势,这个要折中考虑,有时间的话在写redis的介绍,以上是我对memecached的点滴总结,如有什么问题,可以关注我的微信公众号反馈给我,希望对各位读者有一定的帮助!
详解MemCached原理的更多相关文章
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 丰富图文详解B-树原理,从此面试再也不慌
本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五.我相信大家应该能从标题当中体会到这个硬核. 周五的专题是大数据和分布式,我最初的打算 ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介
1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...
- Percona-xtrabackup 使用详解与原理
现在有个需求需要对使用 innodb 的数据库进行热备.网上查了很多工具皆推荐 Percona-xtrabackup 于是就仔细了解调研一番. 我们可以前往 https://www.percona.c ...
- ThreadLocal类详解:原理、源码、用法
以下是本文目录: 1.从数据库连接探究 ThreadLocal 2.剖析 ThreadLocal 源码 3. ThreadLocal 应用场景 4. 通过面试题理解 ThreadLocal 1.从数据 ...
- ThreadLocal用法详解和原理
一.用法 ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量. 1.Thr ...
- 详解Zookeeper原理与应用场景
Zookeeper 分布式协调服务 应用之处:发布.订阅,命名服务,分布式协调和分布式锁 对比 Chubby: Chubby 被定义为 分布式的锁服务 为分布式系统提供 松耦合.粗粒度 的分布式锁功能 ...
- ThreadLocal用法详解和原理(转)
本文转自https://www.cnblogs.com/coshaho/p/5127135.html 感谢作者 一.用法 ThreadLocal用于保存某个线程共享变量:对于同一个static Thr ...
- HTTP详解工作原理
1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...
随机推荐
- Goodchild教授关于GIS的四大预测的不同看法
Goodchild教授的关于GIS的4个未来发展的预测不断有人在微信朋友圈里转发,虽然现在做的工作GIS只是一个基本的工具之一了,但对这4个预测还是有不少不同看法和一点自己的意见. Goodchild ...
- Hadoop学习篇1 快速入门
Hadoop是Apache Lucene创始人Doug Cutting创建的,Hadoop起源于Apache Nutch,一个开源的网络搜索引擎.最先引起注意是2003年google的一篇论文,该论文 ...
- [转]mongodb与mysql相比的优缺点
原文地址:http://blog.sina.com.cn/s/blog_966e430001019s8v.html 与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问 ...
- 极简MVC的实现
我们来打造一个简单的专用于json调用的mvc实现,最终会将如下的C#代码暴露给js调用(代码在最后面有下载): public class UserController { public static ...
- C# 遍历DLL导出函数
C#如何去遍历一个由C++或E语言编写的本地DLL导出函数呢 不过在这里我建议对PE一无所知的人 你或许应先补补这方面的知识,我不知道为什么PE方面的 应用在C#中怎么这么少,我查阅过相关 C#的知识 ...
- [开发笔记]-MarkDown语法
马克飞象MarkDown在线编辑器 http://maxiang.info/?basic 1. H1--H6 相应数量的# 2. 底线形式 = H1(最高阶标题)和- H2(第二阶标题) 3. 段落和 ...
- Windows 2012 安装 .net framework 3.5
使用 PowerShell, 指定源文件路径然后进行安装: Install-WindowsFeature NET-Framework-Core –Source D:\Sources\sxs 使用命令提 ...
- LeetCode: Unique Binary Search Trees II 解题报告
Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...
- 高效开发Android App的10个建议
假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗电或者内存占用等 ...
- [译] 二、开始iOS编程之前,你还需要做什么?
声明:本文翻译自AppCoda网站的文章:What You Need to Begin iOS Programming?,作者是创建者Simon Ng.如有异议,请联系博主. 更新:帖子已经重新被 ...