详解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服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...
随机推荐
- Mac 安装 home Brew以及 XCTool的过程记录
一.HomeBrew相关: 先对HomeBrew做一个简单的介绍吧,之前了解的也不多. 主要就是用于安装Unix的工具包. 注意:HomeBrew依赖于Xcode的 Command Line Tool ...
- Codeforces Round #384 (Div. 2)B. Chloe and the sequence 数学
B. Chloe and the sequence 题目链接 http://codeforces.com/contest/743/problem/B 题面 Chloe, the same as Vla ...
- Android Studio 快捷键 for mac
Action Mac OS Win/Linux 打开文件 Cmd + shift + O 打开Class文件 Cmd + O 覆写方法 Ctrl + O 生成方法(重写构造.setter ...
- 解决vbox下安装centos不能上网问题
由于工作需要用到Centos做服务器,使用VBOX安装Centos7系统后发现不能上网,记录解决方法,以便下次使用.找到/etc/sysconfig/network-scripts/ifcfg-enp ...
- "无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开"解决办法
当程序用ado的jet4.0方式连接mdb数据库的时候,对于设有access数据库密码的mdb的访问居然报错“无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开”. ADOConne ...
- 写essay和research paper必用的17个网站
1.http://scholar.google.com/ 虽然还是Beta版,但个人已觉得现在已经是很好很强大了,Google学术搜索滤掉了普通搜索结果中大量的垃圾信息,排列出文章的不同版本以及被其它 ...
- [GraphQL] Use GraphQLNonNull for Required Fields
While certain fields in a GraphQL Schema can be optional, there are some fields or arguments that ar ...
- 使用 T-SQL 计算当日日期、本周第一天与最后一天
--当日日期 ); SET @Today = DATENAME(YEAR, GETDATE()) + '-' + DATENAME(MONTH, GETDATE()) + '-' + DATENAME ...
- ch4 MySQL 安全管理
第 4 章 MySQL 安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司 ...
- 大型网站系统架构演化之路【mark】
前言 一 个成熟的大型网站(如淘宝.天猫.腾讯等)的系统架构并不是一开始设计时就具备完整的高性能.高可用.高伸缩等特性的,它是随着用户量的增加,业务功能的 扩展逐渐演变完善的,在这个过程中,开发模式. ...