面试系列-Memcached面试专题
导语
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面试专题相关推荐
- 面试系列-Java面试总则
Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...
- 面试系列 -- 常见面试问题回答思路
面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据.对应聘者而言,了解这些问题背后的"猫腻"至关重要.本文对面试中经常出现的一些典型问题进行了整理 ...
- 【面试系列】面试中项目如何准备?
本人在准备面试时做的项目是"在线教育系统",现在把它的项目笔记发出来,供各位小伙伴参考,也祝各位小伙伴们能找到自己心仪的工作. 零.介绍项目 先引用一段牛客上一位伙伴的心得,我感觉 ...
- 面试系列 | 技术面试老是有劲使不出,该怎么办
" 阅读本文大概需要 10 分钟 " . 技术面试老是有劲使不出,该怎么办? 又到了一年金三银四,回想到很多年前我刚参加工作时的面试经历,那时都是呆呆地等着面试官问问题,被问到一些 ...
- 程序员面试系列之Java单例模式的攻击与防御
我写的程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java ...
- Java面试系列之并发编程专题-Java线程池灵魂拷问
金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...
- 大厂面试系列(中)—拿到蚂蚁金服社招offer,过来还愿分享面经
点赞关注,不会迷路! 前言 最近来给大家 分享一些好的面经和面试题.准备出一系列,持续更新.想看更多的可以点关注 来我主页看哈.点这里看大厂系列(上) 来吧 面试! 蚂蚁 面试前 蚂蚁的面试挺独 ...
- Android 面试系列 Dn.1---- Service?
Yo....Yo..Yo... 各位学zha老爷们好,我是靠颜值混日子的榴莲欧巴,欢迎学zha老爷们按时来阅读今天的 Android面试系列.如果您是一个年龄小于24岁妹纸,一定要关注微信公众号&qu ...
- 【面试系列】6种单例模式(Singleton)实现方法比较
转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...
最新文章
- 计算机二级题目小汽车大客车,浙江省计算机二级办公软件Excel练习题.xls
- (58)模拟线程切换——添加挂起、恢复线程功能
- GoogleAppEngine是什么?
- Consumer搭建
- 关于android中postDelayed方法的讲解
- hive 集成sentry
- dw中HTML修改背景图片,dreamweaver将一个图片设定背景,用代码怎么写?
- 天公不作美 SpaceX再次推迟星链卫星发射
- 请实现一个函数,用来判断一棵二叉树是不是对称的。
- 金钱工具类 MoneyUtils.java
- ES6之let能替代var吗?
- java学习(三)内部类
- 快速西门子PLC入门(适合零基础)
- 如何将google切片发布成arcgis服务并生成tpk包
- C语言中向量的加法,向量的加减法运算法则
- SCU2016-05 I题 trie图 + 大数dp
- 充满正能量阳光活的生日祝福语
- Sublime Text 3 装了Anaconda 写Python代码出现框框的解决办法
- sort函数数组排序(c++方法)
- 小试牛刀 - WordCount
热门文章
- mysql解压版安装配置
- Kooteam 0.2.0 发布,新增周报、日报功能
- 《大数据、小数据、无数据:网络世界的数据学术》一 3.5 交流融合
- ADMT3.2域迁移之Server2003至Server2012系列(五)添加域管理员权限
- 删除 Tomcat 上次关闭遗留下来的 SESSION 缓存
- Screen Saver(屏幕保护设置) in Cocoa
- .Net Framework SDK下的命令汇总
- EIGRP单边邻居——认证
- System x借至强5500完成进化
- iDow Brand——关于一个商标的构思。