C/C++教程

Memcached面试题

本文主要是介绍Memcached面试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


1、Memcached 是什么,有什么作用?


Memcached 是一个开源的,高性能的内存绶存软件,从名称上看 Mem 就是内存的意思,而 Cache 就是缓存的意思。Memcached 的作
用:通过在事先规划好的内存空间中临时绶存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访
问性能,加速网站集群动态应用服务的能力。

 

2、memcached 服务在企业集群架构中有哪些应用场景?

 

特殊说明:Memcached 集群和 web 服务集群是不一样的,所有 Memcached 的数据总和才是数据库的数据。每台 Memcached 都是部分
数据。(一台 memcached 的数据,就是一部分 mysql 数据库的数据)


一、作为数据库的前端缓存应用
a、完整缓存(易),静态缓存
例如:商品分类(京东),以及商品信息,可事先放在内存里,然后再对外提供数据访问,这种先放到内存,我们称之为预热,(先把数据
存缓存中),用户访问时可以只读取 memcached 缓存,不读取数据库了。
b、执点缓存(难)
需要前端 web 程序配合,只缓存热点的数据,即缓存经常被访问的数据。先预热数据库里的基础数据,然后在动态更新,选读取缓存,如
果缓存里没有对应的数据,程序再去读取数据库,然后程序把读取的新数据放入缓存存储。

3、Memcached 服务特点及工作原理是什么?
a、完全基于内存缓存的
b、节点之间相互独立
c、C/S 模式架构,C 语言编写,总共 2000 行代码。
d、异步I/O 模型,使用 libevent 作为事件通知机制。
e、被缓存的数据以 key/value 键值对形式存在的。
f、全部数据存放于内存中,无持久性存储的设计,重启服务器,内存里的数据会丢失。
g、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用 LRU 算法删除过期的缓存数据。
h、可以对存储的数据设置过期时间,这样过期后的数据自动被清除,服务本身不会监控过期,而是在访问的时候查看 key 的时间戳,判断是
否过期。
j、memcache 会对设定的内存进行分块,再把块分组,然后再提供服务

5、memcached 是怎么工作的?
Memcached 的神奇来自两阶段哈希(two-stage hash)。Memcached 就像一个巨大的、存储了很多<key,value>对的哈希表。通过 key,
可以存储或查询任意的数据。
客户端可以把数据存储在多台 memcached 上。当查询数据时,客户端首先参考节点列表计算出 key 的哈希值(阶段一哈希),进而选中
一个节点;客户端将请求发送给选中的节点,然后 memcached 节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item) 


6、memcached 最大的优势是什么?


Memcached 最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易
增加大量 memcached到集群中。memcached 之间没有相互通信,因此不会增加 memcached 的负载;没有多播协议,不会网络通信量爆
炸(implode)。memcached 的集群很好用。内存不够了?增加几台 memcached 吧;CPU 不够用了?再增加几台吧;有多余的内存?
在增加几台吧,不要浪费了。
基于 memcached 的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇 FAQ,在其他地方很容易找到详细资料的。 


7、memcached 和 MySQL 的 query

cache 相比,有什么优缺点? 


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

1、在 MySQL 的 query cache 中,我们是不能存储任意的数据的(只能是SQL 查询结果)。而利用 emcached,我们可以搭建出各种高效的
缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到 memcached 中。而 query cache
是 SQL 语句级别的,不可能做到这一点。在小的网站中,query cache 会有所帮助,但随着网站规模的增加,query cache 的弊将大于利

2、query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。
但是,有了memcached,只要您有空闲的内存,都可以用来增加 memcached 集群的规
模,然后您就可以缓存更多的数据。

3、当您修改表时,MySQL 的 query cache 会立刻被刷新(flush)。存储一个 memcached item 只需要很少的时间,但是当写操作很频繁
时,MySQL的 query cache 会经常让所有缓存数据都失效。

4、在多核 CPU 上,MySQL 的 query cache 会遇到扩展问题(scalabilityissues)。在多核 CPU 上,query cache 会增加一个全局锁
(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢

8、memcached 和服务器的 local cache(比如 PHP 的 APC、mmap 文件等)相比,有
什么优缺点?


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

1、local cache 的数据查询更快。考虑把 highly common 的数据放在 localcache 中吧。如果每个页面都需要加载一些数量较少的数据,考
虑把它们放在local cached 吧。

2、local cache 缺少集体失效(groupinvalidation)的特性。在 memcached 集群中,删除或更新一个 key 会让所有的观察者觉察到。但是
在 local cache 中, 我们只能通知所有的服务器刷新 cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。

3、local cache 面临着严重的内存限制,这一点上面已经提到

9、memcached 的 cache 机制是怎样的?


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


10、memcached 如何实现冗余机制?


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


11、memcached 如何处理容错的?


不处理!
在 memcached 节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失
效时,下面列出几种方案供您选择: 

1.忽略他,在失效节点别回复或替代之前,还有很多节点可以对应节点带来影响

2.把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓
存数据不可用!因为哈希参照的节点列表变化了,大部分 key 会因为哈希值的改变而被映射到(与原来)不同的节点上。

3.启动热备节点,接管失效节点所占用的 IP。这样可以防止哈希紊乱(hashing chaos)。

4、两次哈希(reshing)。当客户端存取数据时,如果发现一个节点 down了,就再做一次哈希(哈希算法与前一次不同),重新选择另一
个节点(需要注意的时,客户端并没有把 down 的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈
希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据(stale data)。

5、如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing)。您可以百度一下一致性哈希算
法。支持一致性哈希的客户端已经很成熟,而且被广泛使用。去尝试一下吧!

这篇关于Memcached面试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!