memcached面试专题
memcached 是怎么工作的?
Memcached 的神奇来自两阶段哈希(two-stage hash)。Memcached 就像一个巨大的、存储
了很多<key,value>对的哈希表。通过 key,可以存储或查询任意的数据。
客户端可以把数据存储在多台 memcached 上。当查询数据时,客户端首先参考节点列表计
算出 key 的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,
然后 memcached 节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。
举个列子,假设有 3 个客户端 1, 2, 3,3 台 memcached A, B, C:
Client 1 想把数据”barbaz”以 key “foo”存储。Client 1 首先参考节点列表(A, B, C),计算 key
“foo”的哈希值,假设 memcached B 被选中。接着,Client 1 直接 connect 到 memcached B,
通过 key “foo”把数据”barbaz”存储进去。 Client 2 使用与 Client 1 相同的客户端库(意
味着阶段一的哈希算法相同),也拥有同样的 memcached 列表(A, B, C)。
于是,经过相同的哈希计算(阶段一),Client 2 计算出 key “foo”在 memcached B 上,然后
它直接请求 memcached B,得到数据”barbaz”。
各种客户端在 memcached 中数据的存储形式是不同的(perl Storable, php serialize, java
hibernate, JSON 等)。一些客户端实现的哈希算法也不一样。但是,memcached 服务器端的
行为总是一致的。
最后,从实现的角度看,memcached 是一个非阻塞的、基于事件的服务器程序。这种架构
可以很好地解决 C10K problem ,并具有极佳的可扩展性。
可以参考 A Story of Caching ,这篇文章简单解释了客户端与 memcached 是如何交互的。
memcached 最大的优势是什么?
请仔细阅读上面的问题(即 memcached 是如何工作的)。Memcached 最大的好处就是它带
来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,
那么我们很容易增加大量 memcached 到集群中。memcached 之间没有相互通信,因此不
会增加 memcached 的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached
的集群很好用。内存不够了?增加几台 memcached 吧;CPU 不够用了?再增加几台吧;
有多余的内存?在增加几台吧,不要浪费了。
基于 memcached 的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇
FAQ,在其他地方很容易找到详细资料的。
看看下面的几个问题吧,它们在 memcached、服务器的 local cache 和 MySQL 的 query
cache 之间做了比较。这几个问题会让您有更全面的认识。
memcached 和 MySQL 的 query cache 相比,有什么优缺点?
把 memcached 引入应用中,还是需要不少工作量的。MySQL 有个使用方便的 query
cache,可以自动地缓存 SQL 查询的结果,被缓存的 SQL 查询可以被反复地快速执行。
Memcached 与之相比,怎么样呢?MySQL 的 query cache 是集中式的,连接到该 query
cache 的 MySQL 服务器都会受益。
- 当您修改表时,MySQL 的 query cache 会立刻被刷新(flush)。存储一个 memcached item
只需要很少的时间,但是当写操作很频繁时,MySQL 的 query cache 会经常让所有缓存数据
都失效。 - 在多核 CPU 上,MySQL 的 query cache 会遇到扩展问题(scalability issues)。在多核 CPU
上,query cache 会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会
变得更慢。 - 在 MySQL 的 query cache 中,我们是不能存储任意的数据的(只能是 SQL 查询结果)。
而利用 memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,
构建出一个用户对象(user object),然后将用户对象缓存到 memcached 中。而 query
cache 是 SQL 语句级别的,不可能做到这一点。在小的网站中,query cache 会有所帮助,
但随着网站规模的增加,query cache 的弊将大于利。 - query cache 能够利用的内存容量受到 MySQL 服务器空闲内存空间的限制。给数据库服务
器增加更多的内存来缓存数据,固然是很好的。但是,有了 memcached,只要您有空闲的
内存,都可以用来增加 memcached 集群的规模,然后您就可以缓存更多的数据。
memcached 和服务器的 local cache(比如 PHP 的 APC、mmap 文件等)相比,有什么优缺
点?
首先,local cache 有许多与上面(query cache)相同的问题。local cache 能够利用的内存容量
受到(单台)服务器空闲内存空间的限制。不过,local cache 有一点比 memcached 和
query cache 都要好,那就是它不但可以存储任意的数据,而且没有网络存取的延迟。 - local cache 的数据查询更快。考虑把 highly common 的数据放在 local cache 中吧。如果每
个页面都需要加载一些数量较少的数据,考虑把它们放在 local cached 吧。 - local cache 缺少集体失效(group invalidation)的特性。在 memcached 集群中,删除或更
新一个 key 会让所有的观察者觉察到。但是在 local cache 中, 我们只能通知所有的服务器
刷新 cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。 - local cache 面临着严重的内存限制,这一点上面已经提到。
memcached 的 cache 机制是怎样的?
Memcached 主要的 cache 机制是 LRU(最近最少用)算法+超时失效。当您存数据到
memcached 中,可以指定该数据在缓存中可以呆多久 Which is forever, or some time in the
future。如果 memcached 的内存不够用了,过期的 slabs 会优先被替换,接着就轮到最老的
未被使用的 slabs。
memcached 如何实现冗余机制?
不实现!我们对这个问题感到很惊讶。Memcached 应该是应用的缓存层。它的设计本身就
不带有任何冗余机制。如果一个 memcached 节点失去了所有数据,您应该可以从数据源
(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。
不要写一些糟糕的查询代码,寄希望于 memcached 来保证一切!如果您担心节点失效会
大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少
丢失一个节点的影响),热备节点(在其他节点 down 了的时候接管 IP),等等。
memcached 如何处理容错的?
不处理!memcached面试专题相关推荐
- 面试系列-Memcached面试专题
导语 Memcached 是一套分布式的高速缓存系统.在很多网站被广泛使用.下面就来看一下在面试过程中对于Memcached的相关面试题. 1.Memcached 是怎么工作的? Memcac ...
- php面试专题---MYSQL查询语句优化
php面试专题---MYSQL查询语句优化 一.总结 一句话总结: mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存) ...
- hashmap中用红黑树不用其他树_HashMap面试专题:常问六题深入解析
引言 其实我很早以前就想写一篇关于HashMap的面试专题.对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可. 然而,鉴于网 ...
- BAT Android面试专题深入探究:四大组件+ViewPager+组件化架构+Bitmap
本篇是结合我之前面试别人的经验,以及跟一些在BAT上班的朋友,讨论总结出的一份很深的大公司需要用到的一些高端Android技术.这里也专门整理了一个文档,重点和难点都有详细解析.这些题目有点技术含量, ...
- php面试专题---2、常量及数据类型考点
php面试专题---2.常量及数据类型考点 一.总结 一句话总结: 变量为null和变量判断为false的情况需要仔细注意下 1.PHP中字符串可以使用哪三种定义方法以及各自的区别是什么? 单引号:不 ...
- BAT面试进阶:最全Memcached面试30题含答案
[memcached面试题目] Memcached服务在企业集群架构中应用场景? Memcached服务在不同企业业务应用场景中的工作流程? Memcached服务分布式集群如何实现? Memcach ...
- mysql优化php面试_php面试专题---18、MySQL查询优化考点
php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...
- 【Java架构师面试题】设计模式面试专题(共35题含答案)
设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 本篇为设计 ...
- php面试专题---MySQL常用SQL语句优化
php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...
- php面试专题---6、正则表达式考点
php面试专题---6.正则表达式考点 一.总结 一句话总结: 正则匹配步骤:1.先写出一个要匹配的字符串:2.自左向右的顺序使用正则表达式的原子和元字符进行拼接:3.最终加入模式修正符: 1.写出一 ...
最新文章
- VS插件开发——格式化变量定义语句块
- 浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案
- 设置更改root密码 连接mysql mysql常用命令
- 莫队(不带修改)模板
- kibana升级之后原本保存的数据dashboards, visualizations, index patterns丢失
- win2008R2管理员密码修改文档
- javascript中的小括号
- redhat linux5 安装配置 JDK1.6+Tomcat6+Apache2.2.x+jk_mod1.2
- 二分法求非线性方程组Java_用C#编写二分法解一元非线性方程
- Android 打造编译时注解解析框架
- android app反解工具,安卓反编译逆向工具:Apktool + dex2jar 教程
- ANSYS apdl命令流笔记15-------模态分析
- Windows中Python3.x下运行Python2.x程序解决方案
- 无插件使用Eclipse和Resin调试WEB应用(Debug Web App In Ecli...
- uva 11290 - Gangs(卡特兰数)
- 多类隶属度的模糊支持向量机(FSVM)
- Vue中图片实现毛玻璃效果
- 阿里云服务器部署StreamX
- 从反反鸡汤谈过犹不及
- 改进的IAYOLO---GDIP:Gated Differentiable Image Processing for Object-Detection inAdverse Conditions
热门文章
- 面试系列-Memcached面试专题