memcached是怎么工作的?Memcached的神奇来自两阶段哈希(two-stagehash)。Memcached就像一个巨大的、存储了很多对的哈希表。通过key,可以存储或查询任意的数据。客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。举个列子,假设有3个客户端1,2,3,3台memcachedA,B,C:Client1想把数据”barbaz”以key“foo”存储。Client1首先参考节点列表(A,B,C),计算key“foo”的哈希值,假设memcachedB被选中。接着,Client1直接connect到memcachedB,通过key“foo”把数据”barbaz”存储进去。Client2使用与Client1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A,B,C)。于是,经过相同的哈希计算(阶段一),Client2计算出key“foo”在memcachedB上,然后它直接请求memcachedB,得到数据”barbaz”。各种客户端在memcached中数据的存储形式是不同的(perlStorable,phpserialize,javahibernate,JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。最后,从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10Kproblem,并具有极佳的可扩展性。可以参考AStoryofCaching,这篇文章简单解释了客户端与memcached是如何交互的。memcached最大的优势是什么?请仔细阅读上面的问题(即memcached是如何工作的)。Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇FAQ,在其他地方很容易找到详细资料的。看看下面的几个问题吧,它们在memcached、服务器的localcache和MySQL的querycache之间做了比较。这几个问题会让您有更全面的认识。memcached和MySQL的querycache相比,有什么优缺点?把memcached引入应用中,还...