导语
  Memcached 是一套分布式的高速缓存系统。在很多网站被广泛使用。下面就来看一下在面试过程中对于Memcached的相关面试题。

1、Memcached 是怎么工作的?

  Memcached 是使用两端哈希(Two-stage Hash)。Memcached 像是一个存储了很多KV的哈希表,通过Key,可以存储或者查询到任意的数据。

  客户端可以包数据存储在多个Memcached 上。当查询数据的时候,客户端首先参考节列表计算出Key的哈希值(第一阶段Hash),从而选择一个节点;客户端将请求发送给选中的节点,然后Memcached 节点通过一个内部的哈希算法(第二阶段Hash),查找到真正的数据(item)。

  举例子,假设有3个客户端1,2, 3 。3台Memcached A,B,C

   Client 1 想把数据“Helloween” 以 key 为 “hello” 的方式进行存储。Client1 首先参考节点列表(A,B,C),计算Key “hello” 的哈希值,假设Memcached B被选中。接着,Client 1 直接 connect 到Memcached B, 通过 key “hello” 把数据存储到其中。

  Client 2 使用与Client 1 相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的Memcached 列表(A,B,C)。经过相同的哈希计算(阶段一),Client 2 计算的key “hello” 在Memcached B上,然后它直接请求Memcached B,得到数据 “Helloween”。

  各种客户端在Memcached 中的存储形式是不一样的(Perl Storable,PHP Serialize,Java Hibernate,JSON等)。一些客户端 实现的哈希算法也不一样。但是Memcached 服务端的行为总是一致的。

  从实现的角度看,Memcached 是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。

2、Memcached 最大的优势是什么?

  Memcached 最大 的好处就是它带来的水平可扩展性,特别在一个巨大的系统中,由于客户端自己做了一次Hash,那么会很容易增加大量的Memcached到集群中。Memcached 之间没有相互通信 ,所以不会增加Memcached 的负载;没有多播协议,不会网络通信爆炸(implode)。Memcached 的集群很好用,内存不够,增加几台Memcached,CPU不够用,也只需要在增加Memcached 就可以。

3、Memcached 和MySQL 的query cache 相比,有什么优缺点?

  把Memcached 引入应用中,还是需要不少的工作量,MySQL 有个使用方便的query cache ,可以自动地缓存SQL 查询结果,被缓存的SQL查询可以被反复的快速执行。Memcached 与之相比,怎么样?MySQL query cache 的集中式的,连接到该query cache 的MySQL服务器都会受益。

  • 当需要修改表的时候,MySQL 的query cache 会被立刻刷新,存储一个Memcached item 需要的时间很短,但是当写操作频繁的时候,MySQL 的query cache 会经常让所有缓存数据都失效。
  • 在多核CPU上,MySQL的query cache 会遇到扩展问题。在多核CPU上,query cache 会增加一个全局锁,由于需要刷新更多的缓存数据,速度会变慢。
  • 在MySQL的query cache 中,不能存储任意的数据(只能是SQL的查询结果)。而利用Memcached ,可以搭建出各种高效的缓存,例如,可以执行多个独立的查询,创建一个用户对象,然后将用户对象缓存到Memcached中,而query cache是SQL语句级别的,不可能做到这一点,在小网站中,query cache 会有所帮助,但随着网站规模的增加,query cache 的弊端大于利。
  • query cache 能够利用的内存容量受到MySQL服务器空闲内存空间的限制,给数据库服务器增加更多的内存来缓存数据,固然很好,但是有了Memcached,只要有空闲的内存,都可以用来增加Memcached的集群规模,然后就可以缓存更多的数据了。

4、Memcached 和服务器的 local cache相比,有什么优缺点

  首先local cache 有许多与上面query cache 相同的问题。local cache 能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过local cache 有一点比Memcached 和query cache 都要好,那就是它不但可以存储任意的数据,还没有网络存取的延迟。

  • local cache 的数据查询更快,考虑吧highly common 的数据放在local cache中,如果每个页面都需要加载一些数据量较小的数据,可以考虑将其放入到local cache中。
  • local cache 缺少集体失效(group invalidation)的特性。在Memcached 集群中,删除或者更新一个key的时候会让所有的观察者察觉到。在local cache中,只能通过通知所有服务器刷新 cache的方式,后者仅仅依赖缓存超时失效机制。
  • local cache 面临的是严重的内存限制。

5、Memcached 的Cache机制是怎么样的?

   Memcached 主要的Cache机制是LRU(最近最少用) 算法+超时失效。当存储的数据到Memcached 中,可以指定该数据在缓存中可以呆多久,如果Memcached 的内存不够用了,过期的slabs 会被优先替换,接着就是最老的未被使用的slabs。

6、Memcached 如何实现冗余机制?

  不实现,Memcached 应该是应用缓存层,它的设计本来就是不带有任何冗余机制的,如果一个Memcached 节点失去了所有数据,应该可以从数据源再次获取到数据,需要注意的是,应用应该可以容忍节点的失效。所以不要写一些糟糕的代码,从而寄希望于Memcached来保证一切,如果担心节点失效会增加数据库的负担,那么可以使用其他的办法来进行保证。例如可以增加多个节点,或者是热备份节点等等操作。

7、Memcached 如何容错的?

  不处理,在Memcached 节点失效的情况下,集群没有必要做任何容错机制出来了。如果发生了节点失效,应对的措施完全取决于用户,节点失效的时候,可以通过如下的一些方案来实现:

  • 忽略,在失效节点恢复之前或者被替换之前,还有很多其他节点可以应对节点失效带来的影响。
  • 把失效的节点从节点列表中移除,这个操作千万小心,在默认情况下(余数式哈希算法),客户端添加或者移除节点,会导致所有的缓存数据不可用!因为Hash 参照的节点列表变化了,大部分的Key会因为Hash值的变化而改变到其他映射订的节点上。
  • 启动热备节点,接管失效节点所占用的IP,这样就可以防止哈希紊乱。
  • 如果希望添加或者移除接单,而不影响原来的Hash结果,可以使用一致性Hash算法。
  • 两次Hash,当客户端存取数据的时候,返现一个节点down了,就再做一次哈希,重新选择另一个节点,如果某个节点时好时坏,那么两次Hash也就有风险了,好的节点和坏的节点都可能存在脏数据。

8、如何将Memcached中的Item批量导入导出?

  不允许,Memcached 是一个非阻塞的服务器,任何可能导致Memcached 暂停或者瞬时拒绝服务的操作都是需要经过深思熟虑的,向Memcached 中批量导入数据往往并不是真实的目的,真实的目的是更新数据,如果数据之间出现了变化,那就需要处理脏数据了。如果数据在导入导出之间过期了,那么这些数据又如何进行处理呢?

  所以,批量导入导出并不能正常的保证数据的可用性,但在某些场景中,是比较有用的,如果存在大量的从来都不会变化的数据,并且希望缓存能很快的热起来,批量导入的缓存数据是很有帮助的,虽然这个场景并不是典型的场景,在实际开发的过程中确实比较常见的,所以也是可以用的。

9、Memcached 是如何做身份验证的?

   没有身份验证机制,Memcached 是运行在应用下层的软件。Memcached 客户端和服务端之间是轻量级的,部分原因就是完全没有实现身份验证的机制,这样Memcached可以很快的创建连接,服务端也不需要任何的配置。

10、Memcached 的多线程是什么?如何使用它们?

  线程就是定律,在Memcached1.2 以及更高版本拥有了多线程模式。多线程模式允许Memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据,Memcached 使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个Memcached实例,这种方式能够有效的处理 Mulit gets。

  如果系统的负载并不重,或许不需要启动多线程工作模式,如果有一个庞大的软硬件网站,或许可以使用多线程模式。

  命令解析可以运行在多线程模式下,Memcached 内部对数据的操作是基于全局锁的方式,这部分的工作其实并不是多线程的,所以这部分的内容需要进行优化,提高Memcached 在负载极高的场景下的性能。

11、Memcached 能够接受的Key的最大值?

  key的最大长度是250个字符。需要注意的是250是Memcached服务器端的限制,如果客户端支持key的前缀 或者类似的特性,那么两者之和就会超过250个字符,所以需要推荐使用的就是较短的key。可以节省内存提升效率。

12、Memcached 对item 的过期时间有什么限制?

  最大过期时间可以达到30天,Memcached 把传入的过期时间看做是时间点,一旦到了这个时间点,Memcached就会把item设置成失效状态,

面试系列-Memcached面试专题相关推荐

  1. 面试系列-Java面试总则

    Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...

  2. 面试系列 -- 常见面试问题回答思路

    面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据.对应聘者而言,了解这些问题背后的"猫腻"至关重要.本文对面试中经常出现的一些典型问题进行了整理 ...

  3. 【面试系列】面试中项目如何准备?

    本人在准备面试时做的项目是"在线教育系统",现在把它的项目笔记发出来,供各位小伙伴参考,也祝各位小伙伴们能找到自己心仪的工作. 零.介绍项目 先引用一段牛客上一位伙伴的心得,我感觉 ...

  4. 面试系列 | 技术面试老是有劲使不出,该怎么办

    " 阅读本文大概需要 10 分钟 " . 技术面试老是有劲使不出,该怎么办? 又到了一年金三银四,回想到很多年前我刚参加工作时的面试经历,那时都是呆呆地等着面试官问问题,被问到一些 ...

  5. 程序员面试系列之Java单例模式的攻击与防御

    我写的程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java ...

  6. Java面试系列之并发编程专题-Java线程池灵魂拷问

    金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...

  7. 大厂面试系列(中)—拿到蚂蚁金服社招offer,过来还愿分享面经

    点赞关注,不会迷路!    前言 最近来给大家 分享一些好的面经和面试题.准备出一系列,持续更新.想看更多的可以点关注 来我主页看哈.点这里看大厂系列(上) 来吧 面试! 蚂蚁 面试前 蚂蚁的面试挺独 ...

  8. Android 面试系列 Dn.1---- Service?

    Yo....Yo..Yo... 各位学zha老爷们好,我是靠颜值混日子的榴莲欧巴,欢迎学zha老爷们按时来阅读今天的 Android面试系列.如果您是一个年龄小于24岁妹纸,一定要关注微信公众号&qu ...

  9. 【面试系列】6种单例模式(Singleton)实现方法比较

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...

最新文章

  1. 计算机二级题目小汽车大客车,浙江省计算机二级办公软件Excel练习题.xls
  2. (58)模拟线程切换——添加挂起、恢复线程功能
  3. GoogleAppEngine是什么?
  4. Consumer搭建
  5. 关于android中postDelayed方法的讲解
  6. hive 集成sentry
  7. dw中HTML修改背景图片,dreamweaver将一个图片设定背景,用代码怎么写?
  8. 天公不作美 SpaceX再次推迟星链卫星发射
  9. 请实现一个函数,用来判断一棵二叉树是不是对称的。
  10. 金钱工具类 MoneyUtils.java
  11. ES6之let能替代var吗?
  12. java学习(三)内部类
  13. 快速西门子PLC入门(适合零基础)
  14. 如何将google切片发布成arcgis服务并生成tpk包
  15. C语言中向量的加法,向量的加减法运算法则
  16. SCU2016-05 I题 trie图 + 大数dp
  17. 充满正能量阳光活的生日祝福语
  18. Sublime Text 3 装了Anaconda 写Python代码出现框框的解决办法
  19. sort函数数组排序(c++方法)
  20. 小试牛刀 - WordCount

热门文章

  1. mysql解压版安装配置
  2. Kooteam 0.2.0 发布,新增周报、日报功能
  3. 《大数据、小数据、无数据:网络世界的数据学术》一 3.5 交流融合
  4. ADMT3.2域迁移之Server2003至Server2012系列(五)添加域管理员权限
  5. 删除 Tomcat 上次关闭遗留下来的 SESSION 缓存
  6. Screen Saver(屏幕保护设置) in Cocoa
  7. .Net Framework SDK下的命令汇总
  8. EIGRP单边邻居——认证
  9. System x借至强5500完成进化
  10. iDow Brand——关于一个商标的构思。