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 服务器都会受益。