php分佈式緩存系統 Memcached 入門

Memcached 是一個分佈式的緩存系統, 可是 Memcachd 究竟是什麼意思,有什麼做用呢?緩存通常用來保存一些常常被存取的數據和資源(例如:瀏覽器會將訪問過的網頁會話緩存起來),由於經過緩存來存取數據要比從磁盤存取一樣的數據要快得多。因此 Memcached 顧名思義,意味着 「內存緩存」,全部緩存的內容都在服務器的內存中。內存中的這些緩存數據能夠經過 API 的方式被存取。數據是以 key/value 的配對方式存在的,就像一像大的 Hash 表。php

分佈式是 Memcached 的主要特性,因此你能夠在多臺服務器上來安裝 Memcached 來組建一個更大的緩存服務器。這樣一來,Memcached 能夠幫助咱們使數據庫的壓力降到最低, 從而咱們能夠構建出更快的、更具擴展性的 WEB 應用。圖一展現了 Memcache 如何與數據庫端協同工做的狀況。mysql

 

Memcache 如何工做?

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

  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 例子。下面的代碼展現瞭如何從緩存中取得數據,若是數據不存在,則自動從數據庫中查詢須要的數據,並將查詢到的數據保存到緩存中的過程。

<?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 就能夠輕鬆提升你的站點性能,你還等什麼?

相關文章
相關標籤/搜索