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. js 之 object
  2. 如何看待papi酱的个人平台papitube?
  3. Datatable Initialization - 使用objects数据源初始化
  4. 给Tomcat打开远程debug端口
  5. 陌上花开 HYSBZ - 3262 (CDQ分治)
  6. 实例49:python
  7. ibm量子计算机科学家,重磅!IBM发布全球首个独立商用量子计算机
  8. Team Foundation Server 2010 安装、部署与配置(七):创建 Team Project 时的一个 Issue:TF218027 .
  9. windows2008 服务器时间格式改不过来_我用VNPY 1天时间搭建自主量化交易(程序化交易)平台...
  10. 【Spring笔记】依赖注入
  11. Python3 CookBook | 数据结构和算法(一)
  12. SQLmap下载和安装教程(详细附图)
  13. 如何手动优化xp系统
  14. 论文插入参考文献神器——EndNote(包括EndNoteX9安装和破解)
  15. linux的tar命令详情;linux多个文件压缩打包到一个压缩文件
  16. 听吐的微信提示音终于能改了
  17. .Net Core怎么使用Hangfire
  18. 【单目3D目标检测】MonoDLE论文精读与代码解析
  19. 五子棋游戏程序设计制作(C语言)
  20. Java 关于中文乱码问题的解决方案与经验【转载】

热门文章

  1. DiskGenius无损windows系统迁移(增加硬盘)
  2. 一种JPG文件碎片多的恢复方法
  3. 华为手机编写html软件,华为手机居然可以一键生成PPT!这么好用的功能现在才知道!哭了...
  4. Sa-Token+redis实现账号封禁
  5. 机器学习基础:ROC曲线与AUC计算详解
  6. js返回计算机ip地址吗,js获取电脑IP地址???电脑连WIFI的
  7. Educoder实验五硬币抽选问题
  8. 音频基础:粉噪和白噪的区别是什么?
  9. 大型扫码点餐小程序系统源码
  10. 创新实训——第三周2