php分布式緩存系統 Memcached 入門


Memcached 是一個分布式的緩存系統, 但是 Memcachd 到底是什么意思,有什么作用呢?緩存一般用來保存一些經常被存取的數據和資源(例如:瀏覽器會將訪問過的網頁會話緩存起來),因為通過緩存來存取數據要比從磁盤存取同樣的數據要快得多。所以 Memcached 顧名思義,意味着 “內存緩存”,所有緩存的內容都在服務器的內存中。內存中的這些緩存數據可以通過 API 的方式被存取。數據是以 key/value 的配對方式存在的,就像一像大的 Hash 表。

分布式是 Memcached 的主要特性,所以你可以在多台服務器上來安裝 Memcached 來組建一個更大的緩存服務器。這樣一來,Memcached 可以幫助我們使數據庫的壓力降到最低, 從而我們可以構建出更快的、更具擴展性的 WEB 應用。圖一展示了 Memcache 如何與數據庫端協同工作的情況。

 

Memcache 如何工作?

圖一展示的流程,相信有開發過數據庫應用的同學都不會陌生。我們來一步步的說明圖中發生了什么事情:

  1. 檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,這時候跟數據庫就完全扯不上關系了。
  2. 如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。
  3. 保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。

顯而易見,Memcached 在高並發的數據查詢和海量數據輸出的情況下,可以起到很大的作用。因為訪問 Memcached 中的內存數據,要比數據庫的磁盤數據快的多。

如何安裝 Memcache?

如果你想在自己的服務器上嘗試使用 Memcached,第一步就是要在你的服務器上安裝 Memcached 的相關組件。好在Memcached 在很多服務器的發行版軟件上都已經被預安裝了。你可以通過在 Shell 下執行下面的命令,來檢查你的服務器上有沒有被預安裝了 Memcached:

memcached -h

如果 Memcached 有被安裝過,上面的命令會輸出已經安裝的版本號信息及一些幫助信息,否則則會返回一個錯誤。

下面以 CentOs 發行版為例,簡單介紹一下如何安裝 Memcached。

yum install memcached 上面的命令會在線搜索並安裝最新的 Memcached 包。

Memcache 在什么情況下被使用,什么情況下不要使用?

 

你在何時應該使用 Memcache,又要在何時避免使用它?現在你已經知道了,Memcahced 是被設計為減輕數據庫端壓力的。但是你最好能制定一個良好的策略,來想辦法讓 Memcached 來盡可能的緩存那些最影響性能的查詢。你可以試着為應用中的所有查詢做一些執行時間日志,可以幫助你來分析哪些內容是要重點被緩存的。

現在假設你正在運營一個電子商務網站。 你可以在 Memcached 中緩存產品的簡介、運送信息,或者其它一些需要復雜查詢的數據,等等。當一個產品頁被加載的時候,上面提到的數據將會跳過數據庫查詢,直接從緩存中取得。 緩存可以大大的改變你的網站整體性能表現,你只需要記得在后台更新產品的時候,把這些緩存一並更新就行了。

還有一些情況下,緩存數據並不是一個好主意,比如在一個數據被頻繁更新的時候,每一次數據的更新,我們都需要去同時更新緩存,緩存的命中率不高,會導致一些額外的性能犧牲。這種情況下,或許直接查數據庫會更好一些。

Memcached 的安全性

 

如果你了解了 Memcached 的工作流程, 你可能已經注意到了,在訪問緩存的過程中,沒有任何權限控制的相關流程。如果你的數據不是非常重要的,你大可不必擔心這方面的安全問題。如果你需要的話,以下幾點可以協助你更完全的使用它:

  1. 使用唯一的 Key:因為在 Memcached 中的數據是以一個大的數組形式存在的,所以你應該使用唯一的 key。訪問你的數據的唯一辦法就是通過你保存數據時的 key,除此之外再沒有其它可查詢的辦法。
  2. 保證你的 Memcached 器安全: 因為 Memcached 本身並沒有身份驗證機制,所以對 Memcached 的服務器查詢,都應該通過防火牆進行。你可以在防火牆上設定規則,哪些服務器是允許被訪問的,哪些是不允許被訪問的。
  3. 加密你的數據: 你可以將數據和 Key 通過加密的方式保存在 Memcached 中。 這需要花費一些額外的 CPU 時間,但是為了你的數據安全,在情況允許的情況下,這個方法值得你去嘗試。Memcached 代碼實例

 

Memcached 代碼實例

讓我們來看一個實際的 PHP 例子。下面的代碼展示了如何從緩存中取得數據,如果數據不存在,則自動從數據庫中查詢需要的數據,並將查詢到的數據保存到緩存中的過程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
   
class MyCache
{
   private $cache ;
   function  __construct()
   {
     $this ->cache = new Memcache();
     // you can replace localhost by Memcached server IP addr and port no.
     $this ->cache->connect( 'localhost' , 10987);
   }
   
   function get_data( $key )
   {
     $data = $this ->cache->get( $key );
     if ( $data != null)
       return $data ;
     else
     {
       if ( $this ->cache->getResultCode() == Memcached::RES_NOTFOUND)
       {
         //do the databse query here and fetch data
         $this ->cache->set( $key , $data_returned_from_database );
       }
       else
       {
         error_log ( 'No data for key ' . $key );
       }
     }
   }
}
   
$cache = MyCache();
$cache ->get_data( 'foo' );
   
?>

 

要在你的網站使用上面的代碼,請先確認你有安裝 Memcached 的 PHP 擴展。你可以通過 PECL 來安裝對應的開發包。

總結

Memcached 是一個強大的工具,幫忙你建立像 Wikipedia、Flickr、Digg 這樣的大型 WEB 應用。只要通過 Memcached 就可以輕松提高你的站點性能,你還等什么?

 

 

轉:http://blog.csdn.net/jucrazy/article/details/6693407


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM