memcache的工作原理

memcache处理的原子是每一个key、val,key会通过一个hash表转换成hash的key,便于查找对比以及竟可能的做到散列。同时mem用的是一个二级散列,通过一个hash表来维护。
memcache有两个核心组件:服务端和客户端
在一个memcache组件查询中,client先通过key的hash值来确定kv在service端的位置,当server端确定后,客户端就会发一个请求个server端。让它来查找出确切数据,因为这之间没有交互以及多播协议,因此mem带给网络的影响最小。

例如:

client:c1 c2 c3
server: s1 s2 s3

memcache是这样设置kv的:
c1 key=’duanjucai’ val=’就是那个段二狗子’
在存储的时候 c1先对key做hash转化,根据hash转化的值,确定kv对应的服务器。
假设s2被选中了
c1连接上s2,s2收到请求后就会把 key=’duanjucai’ val=’就是那个段二狗子’的这条数据给存起来

memcache是这样取值的:
假设c3想得到 key=’duanjucai’ 的val
1.c3需要用相同的算法算出key=’duanjucai’的hash,并确定他所对应的服务器的位置【计算出来后得到了s2服务器】
c3链接到s2服务器就能得到 key=’duanjucai’ val=’就是那个段二狗子’
这样下来只要所有的服务器想要取得key=’duanjucai’都会去s2的服务器上取

memcache的内存管理机制

memcache会预先分配内存,一般来说一个memcache进程会将自己划分成若干个slab。每个slab下有若干个page,每个page下有若干个chunk。
如果把这几个看成是一个对象的话,他们的关系是一对多的,slab的数量是有限的,这个跟进程配置的内存有关,而每个slab下的page默认是1m,也就是说一个slab占用100M内存的话,那么默认情况下slab所拥有的page数就是100,而 chunk就是我们数据最终要存储的地方。chunk是用于缓存记录的内存空间。

slab class:slab class是具有特定大小的chunk组,每个slab对应一个或多个空间大小相同的chunk组。在memcache中,元素的管理单位就是slab。

chunk:这个是存放元素的最小单元,缓存中的数据最终都会保存在这里,在保存的时候memcache会根据存储数据的大小,将其放在最合适的slab class中。每个slab class中的chunk空间大小都是一样的,所以元素存放进来以后,chunk空间有的会占不满。

page:page的固定大小默认是1M,当slab class空间不足的时候,就会申请page,按照chunk的大小进行切割

memcache的内存是如何分配给元素的

memcache的内存分配以page为单位,默认page是1M【可以在memcache启动时 添加 -I 参数设置 改变slab的大小】memcache在存储数据的时候并不是将所有的数据【所有的数据指的是大小不等的数据】都放在一起,而是预先将存储数据的空间划分成若干个slabs,每个slab只是负责一定范围内的数据存储【大小可以通过-f 设置增长因子 默认是1.25倍】【-n 设置slab的chunk大小从多少开始】

memcache的内存回收是什么时候进行的

与redis不同的是memcache不会主动回收内存。
如果要查询一个已经失效的元素,memcache将会先释放内存,然后将新的数据存进来时,将会重用此内存【前提是新旧元素必须都在同一个slab class中】
由于LRU元素将被踢出,让给新的元素,或者发现有过期的元素它的内存将会被重用。

memcache中的数据什么时候会被踢出去

如果元素还没有失效或则失效日期为0或则将来才失效,slab class已经用完了所有的chunk,并且没有空间的page可以分配给slab class,这个时候就会执行LRU算法

LRU是怎么决定要踢出那个元素的

当存放新的数据的时候,内存可能会被回收,如果在相应的slab class里,既没有空前的chunk,也没有空间的page。memcache将会使用LRU查找出对应的应该被回收的元素。
LRU算法将会从缓存列表中根据最近最少使用原则,查找一些数据,主要是看看这个数据是否已经失效,如果失效了就将这个数据占用的空间重用,如果找不到失效的元素就踢出尾部还没有失效的元素。

memcache的最大优点是啥

Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。
没有多播协议,不会网络通信量爆炸(implode)。
memcached的集群很好用。内存不够了?增加几台 memcached吧;
CPU不够用了?再增加几台吧;
有多余的内存?在增加几台吧,不要浪费了。
内存存储,速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,所以常常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一起 。

缺点是啥

1.不能持久化存储
2.存储数据有限制:1M 【大于1M,认为就行分割】(内存碎片)
3.mm存储数据只能key-value
4.集群数据没有复制和同步机制 【崩溃不会影响程序,会从数据库中取数据】
5.内存回收不能及时 LRU(算法):未使用内存》过期内存》最近最少使用内存 这是惰性删除

memcached如何实现冗余机制

不实现!我们对这个问题感到很惊讶。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于 memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影响),热备节点(在其他节点down了的时候接管IP),等等。

memcached能接受的key的最大长度是多少

key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持”key的前缀”或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。

memcached对item的过期时间有什么限制

过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。

memcached最大能存储多大的单个item

1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

友情链接:http://www.techug.com/memcache-2
手册链接:http://www.jinbuguo.com/man/memcached.html

Memcache原理性的东西 干货相关推荐

  1. 驳斥《沙盒用于数据防泄密是重大技术原理性失误》

    驳斥<沙盒用于数据防泄密是重大技术原理性失误> 最近网上出现了一篇名为<沙盒用于数据防泄密是重大技术原理性失误>的文章,经作者鉴定,是某不良公司***技术领先的竞争对手苏州深信 ...

  2. RAC 的一些概念性和原理性的知识

    RAC 的一些概念性和原理性的知识 一 集群环境下的一些特殊问题 1.1 并发控制 在集群环境中, 关键数据通常是共享存放的,比如放在共享磁盘上. 而各个节点的对数据有相同的访问权限, 这时就必须有某 ...

  3. 分解变频电源的原理性

    变频电源的原理到底是什么样的? 为什么会有如此多的行业要用到ZGYS变频电源? 下面我就一下分解变频电源的原理性吧--中港扬盛专业分享 通常时候,为了产生可变的电压和频率,这个设备首先要把电源的交流电 ...

  4. 刘一男词汇课(从flow到urgent):理性的东西做的越充分,感性的东西就会更轻松

    理性的东西做的越充分,感性的东西就会更轻松 flow做词根,元音消失,因为词根普遍简化, flow 到 flw,flw不能发音,w向u的转换 词根flu-:流 单词flu:流感fluent:flu+e ...

  5. Android系统原理性问题分析 - RefBase、sp、wp 分析

    声明 在Android系统中经常会遇到一些系统原理性的问题,在此专栏中集中来讨论下. 接触Android系统,遇到很多sp.wp相关问题,此篇分析Android系统内的智能指针问题. 此篇参考一些博客 ...

  6. Oracle高人写的Oracle运行原理性文章(zt)

    我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS ...

  7. canal原理的一些学习-1(canal的一些原理性介绍)

    1. cannal 是什么,能做什么用 1.1 mysql的binlog 1.2 mysql 的主从复制过程 1.3 canal能够同步数据的原理 2. quick start 3. canal 的设 ...

  8. Java原理性基础知识整理[详细]

    文章目录 Java程序编译过程 编译型和解析型语言 命名规范 编程风格 大括号 非C风格的数组声明 阿里巴巴Java开发手册 On Java 8 Google Java 编程风格指南 基本数据类型 整 ...

  9. 结合Unity开发中一些编程基础概念与原理性知识总结

     目录: //里氏替换 //抽象类和接口 //虚函数(方法)和抽象方法.普通方法.重载.重写 //指针.引用.值类型.引用类型 //程序.进程.线程.死锁.协程 //内存的几个分区及其作用 //con ...

最新文章

  1. 这些年,在工作中摸索的我
  2. linux fastQC 操作命令,linux-ubuntu下fastQC的安裝及使用
  3. java vote_vote投票系统java jsp mysql
  4. java中使用grpc和protobuf
  5. 当按下ESC键时,关闭应用程序
  6. wsdl 架构验证警告:来自命名空间_金九银十,正在面试吗?面试官必问:JVM架构解读,查漏补缺...
  7. 亚泰盛世携NB物理实验邀你莅临第66届中国教育装备展
  8. 两种SOA平台建设方案比较
  9. ArcCatalog导出数据
  10. 软件工程——软件维护
  11. Springboot毕设项目管易tms运输智能监控管理系统663kq(java+VUE+Mybatis+Maven+Mysql)
  12. 几个在线的维恩图制作站点
  13. 微擎弹出确认授权获取用户头像
  14. 富士施乐FujiXeroxDocuCentre-V2060扫描到PC
  15. MySQL无法连接/端口被占用[解决记录]
  16. oracle 查询去年同期,问个算去年同期值的sql,该怎么处理
  17. java访问excel表格_Java读取excel表格(示例代码)
  18. MacBook Pro USB口可以识别U盘却不能识别手机?
  19. 有什么办法可以将一个宝贝链接多次复制上传到店铺仓库,修改宝贝标题图片后变为一个新的宝贝
  20. 符号三角形问题—回溯算法—java实现

热门文章

  1. 进入网站时背景音乐自动播放
  2. 中文分词(1)--NLTK的基础使用
  3. 论文悦读(2)——NVM文件系统之PMFS文件系统
  4. javaweb学习总结(二十五)——Apache的DBUtils框架学习
  5. 免Root 卸载 系统预装应用
  6. 使用SQL语句DELETE删除表中数据
  7. 现代几何学的次序公理
  8. 易语言 设置屏幕刷新率 源码_iQOO 5 Pro智能手机屏幕测评报告 「Soomal」
  9. Udesk即时通讯网页插件: 按钮设置
  10. 1.2 Cesium渲染流程