Memcache的安裝使用及與mysql交互實例

 1、Memcache介紹

Memcache是一個高性能的分佈式的內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。php

Memcachedanga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用html

Memcache模塊是一個高效的守護進程,提供用與內存緩存的過程式程序和麪向對象的方便的接口,特別是對於設計動態Web程序時減小對數據庫的訪問。mysql

 

2、Windows下memcache的安裝

1.下載Memcache for win32sql

http://www.php100.com/html/download/tools/2010/0125/3857.html數據庫

2.下載php_memcache.dllphp 5.3.8 memcache 擴展dll小程序

http://hi.baidu.com/%E5%E2%E5%CB%C3%AB%C3%AB%B3%E6/blog/item/7612cf35a4425896a71e1267.htmlwindows

Note:注意你安裝的PHP版原本下載相應的dll文件緩存

1. 下載memcachewindows穩定版,解壓放某個盤下面,好比在c:\memcached
2.
在終端(也即cmd命令界面)下輸入 ‘c:\memcached\memcached.exe -d install’ 安裝
3. 再輸入: ‘c:\memcached\memcached.exe -d start’ 啓動安全

4.下載php_memcache.dll,請本身查找對應的php版本的文件(放在php/ext文件夾下)
5. php.ini 加入一行 ‘extension=php_memcache.dll’
6.
從新啓動Apache,而後查看一下phpinfo,若是有memcache,那麼就說明安裝成功!服務器

 

3、如何監測memcache服務端的運行情況

最新的memcache pecl中,新增了一個memcache.php,這個php文件能夠用來方便的查看memcache的情況

能夠到這裏下載源文件:http://livebookmark.net/memcachephp/memcachephp.zip

配置詳解

1、設置用戶名和密碼

define(‘ADMIN_USERNAME’,'memcache’); // Admin Username

define(‘ADMIN_PASSWORD’,'password’); // Admin Password

2、配置服務器及其端口(支持檢測多個主機的memcache)

$MEMCACHE_SERVERS[] = ‘mymemcache-server1:11211′; // add more as an array
$MEMCACHE_SERVERS[] = ‘mymemcache-server2:11211′; // add more as an array

更改成$MEMCACHE_SERVERS[] = ‘127.0.0.1:11211′;
$MEMCACHE_SERVERS[] = ‘192.168.0.1:11211′;

 

4、寫了一個和MySQL交互的小程序代碼

<?php
header("Content-Type:text/html;charset=utf-8");
$db_user='root';
$db_passwd='';
$dsn="mysql:host=localhost;port=3306;dbname=test";

$memcachehost = '127.0.0.1';     //緩存服務器
$memcacheport = 11211;       //緩存服務器端口
$memcachelife = 0;        //緩存生命週期

$mem = new Memcache();       //實例化Memcache對象
$mem->connect($memcachehost, $memcacheport);    //$mem->connect(緩存主機,緩存端口)

try
{                                                            //異常捕捉
 $pdo = new PDO($dsn, $db_user, $db_passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", PDO::MYSQL_ATTR_USE_BUFFERED_QUERY   =>   true));
 unset($db_user);
 unset($db_passwd);    //釋放變量,數據庫安全策略
}
catch (PDOException $e)
{
 echo $e->getMessage();
 exit;
}

function query_memcache($sql){
 global $mem,$memcachelife;
 $key = md5($sql);

 if(!($value = $mem->get($key))){ //Cache中沒有,則從My SQL中查詢  
  echo 11 . '<br />';
  $microtime1 = microtime();     //設置從數據庫取以前的時間
  $query = query($sql); 
  while($item = mysql_fetch_array($query))
  { 
  $result[] = $item;
  }
  $value = $result;
  $microtime2 = microtime();     //設置從數據庫取以後的時間
  //將Key和Value寫入MemCache  
  $mem->set($key,$result,0,$memcachelife);
  $d_value = $microtime2 - $microtime1;  //返回一個時間差
 }
 else
 {
  echo 22 . '<br />';
  $microtime3 = microtime();     //設置從memcache中取以前的時間
  $value = $mem->get($key);
  $microtime4 = microtime();     //設置從memcache中取以後的時間
  $d_value = $microtime4 - $microtime3;  //返回一個時間差
 }
 
 echo $d_value;
 return $value;
}

function query($sql)
{
 if('' == $sql)
 {
  echo 'SQL語句錯誤:SQL語句爲空';
 }
 $query = mysql_query($sql);
 if(!$query)
 {
  echo '錯誤的SQL語句';
 }
 return $query;
}

foreach(query_memcache("select * from test.memcache where value = 'CS133604225199978'") as $row)
{
   //echo $row[0].'-'.$row[1].'<br /><br />';
}

//$mem->flush();   //刷新緩存

5、利用時間差進行測試

現經過時間差測試
通過兩種途徑 一、從數據庫中直接取出數據,在取數據以前設置一個時間戳,取數據以後設置一個時間戳,兩個時間戳相減,返回一個時間差

二、從memcache內存中取出數據,在從內存中取數據以前設置一個時間戳,在取數據以後設置一個時間戳,兩時間戳相減,返回一個時間差

在第一次運行程序時返獲得的時間差是從數據庫中取數據用的時間

 之後再運行程序獲得的時間差是從內存中去數據所用的時間

能夠明顯的看出來從數據庫中取數據所用時間平均是從內存中取數據所用時間的 1000倍左右。

相關文章
相關標籤/搜索