本文转载自 http://www.geekso.com
维基百科上对 Memcached 的介绍是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存来存取数据要比从磁盘存取同样的数据要快得多。所以 Memcached 顾名思义,意味着 “内存缓存”,所有缓存的内容都在服务器的内存中。内存中的这些缓存数据可以通过 API 的方式被存取。数据是以 key/value 的配对方式存在的,就像一个很大的 Hash 表。
分布式是 Memcached 的主要特性,所以你可以在多台服务器上来安装 Memcached 来组建一个更大的缓存服务器。这样一来,Memcached 可以帮助我们使数据库的压力降到最低, 从而我们可以构建出更快的、更具扩展性的 WEB 应用。图一展示了 Memcache 如何与数据库端协同工作的情况。
图一:Memcache 如何和数据库协同工作
Memcache 如何工作?
图一展示的流程,相信有开发过数据库应用的同学都不会陌生。我们来一步步的说明图中发生了什么事情:
检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,这时候跟数据库就完全扯不上关系了。
如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。
显而易见,Memcached 在高并发的数据查询和海量数据输出的情况下,可以起到很大的作用。因为访问 Memcached 中的内存数据,要比数据库的磁盘数据快的多。
如何安装 Memcache?
如果你想在自己的服务器上尝试使用 Memcached,第一步就是要在你的服务器上安装 Memcached 的相关组件。好在Memcached 在很多服务器的发行版软件上都已经被预安装了。你可以通过在 Shell 下执行下面的命令,来检查你的服务器上有没有被预安装了 Memcached:
1 memcached - h
如果 Memcached 有被安装过,上面的命令会输出已经安装的版本号信息及一些帮助信息,否则则会返回一个错误。
下面以 CentOs 发行版为例,简单介绍一下如何安装 Memcached。
yum install memcached
面的命令会在线搜索并安装最新的 Memcached 包。
Memcache 在什么情况下被使用,什么情况下不要使用?
你在何时应该使用 Memcache,又要在何时避免使用它?现在你已经知道了,Memcahced 是被设计为减轻数据库端压力的。但是你最好能制定一个良好的策略,来想办法让 Memcached 来尽可能的缓存那些最影响性能的查询。你可以试着为应用中的所有查询做一些执行时间日志,可以帮助你来分析哪些内容是要重点被缓存的。
现在假设你正在运营一个电子商务网站。 你可以在 Memcached 中缓存产品的简介、运送信息,或者其它一些需要复杂查询的数据,等等。当一个产品页被加载的时候,上面提到的数据将会跳过数据库查询,直接从缓存中取得。缓存可以大大的改变你的网站整体性能表现,你只需要记得在后台更新产品的时候,把这些缓存一并更新就行了。
还有一些情况下,缓存数据并不是一个好主意,比如在一个数据被频繁更新的时候,每一次数据的更新,我们都需要去同时更新缓存,缓存的命中率不高,会导致一些额外的性能牺牲。这种情况下,或许直接查数据库会更好一些。
Memcached 的安全性
如果你了解了 Memcached 的工作流程, 你可能已经注意到了,在访问缓存的过程中,没有任何权限控制的相关流程。如果你的数据不是非常重要的,你大可不必担心这方面的安全问题。如果你需要的话,以下几点可以协助你更完全的使用它:
使用唯一的 Key:因为在 Memcached 中的数据是以一个大的数组形式存在的,所以你应该使用唯一的 key。访问你的数据的唯一办法就是通过你保存数据时的 key,除此之外再没有其它可查询的办法。
保证你的 Memcached 器安全: 因为 Memcached 本身并没有身份验证机制,所以对 Memcached 的服务器查询,都应该通过防火墙进行。你可以在防火墙上设定规则,哪些服务器是允许被访问的,哪些是不允许被访问的。
加密你的数据: 你可以将数据和 Key 通过加密的方式保存在 Memcached 中。 这需要花费一些额外的 CPU 时间,但是为了你的数据安全,在情况允许的情况下,这个方法值得你去尝试。
Memcached 代码实例
让我们来看一个实际的 PHP 例子。下面的代码展示了如何从缓存中取得数据,如果数据不存在,则自动从数据库中查询需要的数据,并将查询到的数据保存到缓存中的过程。
要在你的网站使用上面的代码,请先确认你有安装 Memcached 的 PHP 扩展。你可以通过 PECL 来安装对应的开发包。
1 <? php
2 class MyCache {
3 private $cache ;
4 function __construct() {
5 $this -> cache = new Memcache(); // you can replace localhost by Memcached server IP addr and port no.
6 $this -> cache -> connect( ' localhost ' , 10987 );
7 }
8
9 function get_data( $key ) {
10 $data = $this -> cache -> get( $key );
11 if ( $data != null )
12 return $data ;
13 else {
14 if ( $this -> cache -> getResultCode() == Memcached :: RES_NOTFOUND) { // do the databse query here and fetch data
15
16 $this -> cache -> set( $key , $data_returned_from_database );
17 } else {
18 error_log ( ' No data for key ' . $key );
19 }
20 }
21 }
22 }
23 $cache = MyCache(); $cache -> get_data( ' foo ' );
24 ?>
总结
Memcached 是一个强大的工具,帮忙你建立像 Wikipedia、Flickr、Digg 这样的大型 WEB 应用。只要通过 Memcached 就可以轻松提高你的站点性能,你还等什么?
翻译:avenge
原文链接:http://www.developer.com/features/article.php/52691_3901666_1/Getting-Started-with-Memcached-Distributed-Memory-Caching.htm