使用Memcache緩存MySQL查詢 .

實際應用中,尤爲是在大規模訪問的Web項目中,Memcache做爲一種優秀的緩存解決方案,被普遍使用。其靈活性和可擴展性受到了廣大開發者的青睞。爲了提升響應速度,使用Memcache來減小數據查詢運算是一種不錯的選擇。php

      關於Memcache的安裝和配置,網上有不少資料,這裏就再也不贅述。本文以筆者在實際項目中的應用爲例,來講明如何使用Memcache緩存MySQL數據,從而達到高效數據響應的目的。mysql

 

       需求背景:網站有一個圖片放映功能,頁面加載時需從數據庫中查詢管理員所提交放映的圖片信息,圖片放映區共有9張圖片,對應在數據庫表中有9條記錄。每次用戶訪問網站時,需查詢數據庫,並顯示圖片。當承受大規模用戶同時訪問時,數據庫的壓力可想而之。sql

       爲了下降數據庫壓力,提升查詢速度,我採用了Memcache來將圖片記錄信息緩存到Memcache服務器上。這樣就將數據庫的查詢壓力分散到了各緩存服務器,提升了網站訪問的總體效率。數據庫

 

     1、Memcache 服務器配置(內部集羣模擬)緩存

   

  1. $MEMCACHE_SERVERS[] = '192.168.1.78:11211';  
  2.     $MEMCACHE_SERVERS[] = '192.168.1.78:11212';  
  3.     $MEMCACHE_SERVERS[] = '192.168.1.252:11211';  
  4.     $MEMCACHE_SERVERS[] = '192.168.1.252:11212';  
  5.     //若是要添加Memcache節點,就在此處添加便可。   
  6.       
  7.     $MEMCACHE_LIFETIME = 6000;   // 緩存數據生命週期  

服務器

 

    我採用了兩臺機器做爲Memcache Server,每臺開啓兩個端口提供Memcache服務,每一個服務開啓服務內存爲1G。這樣,緩存空間總的有4G。併發

   2、php鏈接Memcache服務器ide

   php中和Memcache的交互有兩種:一、採用php下的memcache擴展;二、採用libmemcache組件。二者的優劣在此先不做對比。函數

  

  1. $_SGLOBAL['memcache'] = new memcache;  
  2. global $MEMCACHE_SERVERS;  
  3. $result = array();  
  4. foreach ($MEMCACHE_SERVERS as $server){  
  5.         $serverstr = explode(':',$server);  
  6.     $host = $serverstr[0];  
  7.     $port = $serverstr[1];  
  8.          
  9.         $_SGLOBAL['memcache']->addServer($host,$port);  
  10. }   

測試

 

   這段程序從剛剛的memcache服務器配置文件中讀取全部的server列表,並創立鏈接。

   3、php實現memcache和mysql的緩存查詢

   實現原理其實很簡單,在個人數據庫操做類中新增一個函數query_memcache($sql,$type),以$sql的MD5值做爲Key,從 Memcache服務器上查詢是否存在該key的值,若是存在,則直接返回;若是不存在,則從MySQL數據庫中查詢,並將結果寫入Memcache。

  

  1. function query_memcache($sql,$type=''){  
  2.         $key = md5($sql);  
  3.           
  4.         if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中沒有,則從My SQL中查詢   
  5.             $query = $this->query($sql,$type);  
  6.             while($item = $this->fetch_array($query)){  
  7.                 $result[] = $item;  
  8.             }  
  9.             $value = $result;  
  10.               
  11.             //將Key和Value寫入MemCache   
  12.             $_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);  
  13.         }  
  14.         return $value;  
  15.     }  

 

 

   在頁面加載的過程當中,將圖片檢索的數據庫查詢調用改爲用query_memcache()函數便可。

 

   到此,咱們就實現了用Memcache緩存首頁數據信息,經測試,在大規模的併發訪問下,首頁加載速度快了許多。

 

   用計時器測試單臺客戶端訪問響應時間以下:

 

  

  (紅線框內的是第一次從數據庫中讀取數據的耗時,當數據存入Memcache後,讀取數據耗時更短【藍線框的數據】)