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指令集的操作来保证在单个节点下数据的一致性,效率相对来说比加锁要高很多

MemCached存储原理相关推荐

  1. 分布式存储综述、存储原理与设计

    目录 分布式存储概念 分布式文件系统的发展 分布式存储系统的分类 数据类型三大类 分布式存储类型 分布式存储系统的特性 单机存储原理与设计 多机存储原理与设计 FLP定理与设计 CAP定理与设计 2P ...

  2. Memcached存储机制

    Memcached存储机制 memcached 内存管理 分析(转) 缓存.缓存算法和缓存框架简介 memcached全面剖析–PDF总结篇 转载于:https://www.cnblogs.com/d ...

  3. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  4. java浮点数原理,浮点型数据存储原理

    进制基础 1.十进制:逢十进一 基数:10 权:    10^n 科学计数:527=5*10^2+2*10^1+7*10^0 2.二进制:逢二进一 基数:2 权:    2^n 转十进制:110(2) ...

  5. CRM One Order Appointment里start Date的存储原理

    本文介绍CRM One Order Appointment里start Date的存储原理 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  6. Git 存储原理及相关实现

    Git 是目前最流行的版本控制系统,从本地开发到生产部署,我们每天都在使用 Git 进行我们的版本控制,除了日常使用的命令之外,如果想要对 Git 有更深一步的了解,那么研究下 Git 的底层存储原理 ...

  7. java 整数变负数_一文帮你读懂Java整数的存储原理

    前言 大家应该都知道,整数包括负数,零,和正数.在Java中,基本类型中byte(8位).short(16位).int(32位).long(64位)属于整数,并且没有无符号数,均是有符号的.对于计算机 ...

  8. JPEG/Exif/TIFF格式解读(1):JEPG图片压缩与存储原理分析

    JPEG文件简介 JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的 ...

  9. 基于闪存存储原理的U盘数据安全测试和U盘数据保护软件

    第一章 摘要 Flash Memory是一种长寿命的非易失性存储介质,其存储原理存在诸多漏洞.其中最为严重的则为写入次数上限.而以闪存作为存储介质的U盘是否会因闪存的存储缺陷而成为不安全的存储设备,这 ...

  10. minio对象存储原理_使用MinIO在本地运行S3对象存储

    minio对象存储原理 Object storage is amazingly versatile. We normally associate it with AWS S3, but Object ...

最新文章

  1. stateful openflow------整理openstate原理以及具体应用
  2. 最短网络 Agri-Net
  3. vue 发送ajax请求
  4. unity 解决引入dlopen api的问题
  5. 量子计算机迷宫,一个简单的例子,带你读懂量子计算机
  6. es6 Object.assign()方法
  7. 鸿蒙王者荣耀想要转区吗,王者荣耀:跨系统角色转移功能终于上线,想要成功转区,这九点常识必须要知道!...
  8. js进阶 10-9 -of-type型子元素伪类选择器
  9. 导航栏 UITabBarController等颜色的区别
  10. How do you simple use git repository
  11. visual studio emmet使用
  12. 前后端分离 -- 深入浅出 Spring Boot + Vue 实现工程项目进度管理系统 Vue不过如此~
  13. matlab中dstep与step,DINT和DWORD的区别
  14. Fiddler抓包基础使用
  15. xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
  16. 谷歌浏览器访问抖音网页版白屏
  17. 基于机器视觉的移动消防机器人(二)--详细设计
  18. filter 过滤器
  19. 吃透Chisel语言.32.Chisel进阶之硬件生成器(一)——Chisel中的参数化
  20. 学习英语的最系统的方法是什么?

热门文章

  1. 7-3 小L的难题 (15 分)
  2. net framework安装有什么影响_踢脚暖比地暖安装简单,升温快,为什么没有普及?这2点影响很大...
  3. java5个成员_JavaSE基础知识(5)—面向对象(5.2类的成员)
  4. dos系统功能调用的屏幕显示字符是( )号调用_linux混杂设备驱动模型分析(字符设备驱动模型使用篇)...
  5. 【BZOJ3916】friends(hash+分情况讨论)
  6. 【hdu2588】求[1-n]中和n的gcd大于m的数的个数(求欧拉函数值)
  7. 平面圆域分割(欧拉公式)+例题
  8. biopython1_序列操作
  9. vue移动端下拉切换页面_详解vue移动端 下拉刷新
  10. 自动驾驶 8-0: 状态估计的重要 The Importance of State Estimation