首頁  >  文章  >  後端開發  >  memcache介紹

memcache介紹

巴扎黑
巴扎黑原創
2017-07-18 17:29:271595瀏覽

memcached是高效能的分散式的記憶體快取伺服器。由國外社區網站LIVEJOURNAL的開發團隊所開發。

使用目的:

透過快取資料庫查詢結果,減少資料庫的存取次數,以提高動態web應用程式的速度、提高可擴充性。

memcache 是一個自由且開放原始碼、高效能、分散式的記憶體物件快取系統。用於加速動態web應用程序,減少資料庫負載。

memcahce的特徵

1、基於C/S架構,協定簡單

2、基於libevent事件處理{libevent是一個基於事件觸發的網路庫,適用於windows、Linux、bsd(Unix的衍生系統)等多種平台}

3、內建記憶體儲存方式

4、基於客戶端的memcached分佈式

適用場景

1、需要分散式部署的(什麼是分散式:假如一個任務有10個子任務,將這10個子任務分別單獨放到10個伺服器,大大縮短任務執行時間,)

2、需要頻繁存取相同資料

3、需要資料共享的

介紹C/S架構

#安裝啟動(請參閱PDF文件)

各種指令的使用

set/add/replace/delete/get/gets/cas/stats/stats items/ append/prepend/flush_all等等

memcahced一些特性和限制

①在Memcached 中可以保存的item資料量是沒有限制的,只有記憶體足夠

②Memcached單進程最大使用內存為2G,要使用更多內存,可以分多個端口開啟多個Memcached進程

#③最大30天的數據過期時間, 設置為永久的也會在這個時間過期,常量REALTIME_MAXDELTA

④60*60*24*30 控制

⑤最大鍵長為250位元組,大於該長度無法存儲,常數KEY_MAX_LENGTH 250 控制

⑥單一item最大最大資料是1MB,超過1MB資料不予存儲,常數POWER_BLOCK 1048576 進行控制,

⑦它是預設的slab大小

#⑧最大同時連接數是200,透過conn_init()中的freetotal 進行控制,最大軟連接數是1024,透過

⑨settings.maxconns=1024 進行控制⑩跟空間佔用相關的參數:settings.factor=1.25, settings.chunk_size=48, 影響slab的資料佔用和步進方式

PHP的Memcache客戶端所有方法總結

#memcache函數所有的方法清單如下:
Memcache::add – 新增一個值,如果已經存在,則傳回false
Memcache::addServer – 新增一個可供使用的伺服器位址
Memcache::close – 關閉一個Memcache物件
Memcache::connect – 建立一個Memcache物件
memcache_debug – 控制調試功能
Memcache::decrement – 對保存的某個key中的值進行減法操作
Memcache::delete – 刪除一個key值
Memcache::flush – 清除所有緩存的數據
Memcache::get – 取得一個key值
Memcache::getExtendedStats – 取得進程池中所有行程的執行系統統計資料
Memcache::getServerStatus – 取得執行伺服器的參數
Memcache::getStats – 傳回伺服器的一些運行統計資料
Memcache::getVersion – 傳回執行的Memcache的版本資訊
Memcache::increment – 對儲存的某個key中的值進行加法操作
#Memcache::pconnect – 建立一個Memcache的持久連線物件
Memcache::replace -對一個已有的key進行覆寫操作
Memcache::set – 新增一個值,如果已經存在,則會覆寫
Memcache: :setCompressThreshold – 對大於某一大小的資料進行壓縮
Memcache::setServerParams – 在執行時修改伺服器的參數 

PHP的Memcache操作方法分解

#Memcache::add用法

 程式碼如下:
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )



說明:
如果$key不存在的時候,使用這個函數來儲存$var的值。功能相同的函式是memcache_add()。

參數:
$key :將要儲存的鍵值。
$var :儲存的值,字元型和整數會以原值儲存,其他型別自動序列化日後儲存。
$flag:是否用MEMCACHE_COMPRESSED來壓縮儲存的值,true表示壓縮,false表示不壓縮。
$expire:儲存值的過期時間,如果為0表示不會過期,你可以用unix時間戳記或描述來表示從現在開始的時間,但是你在使用秒數表示的時候,不要超過2592000秒(表示30天)。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。如果$key值已經存在,則會傳回FALSE。 其他情況下Memcache::add()的用法類似Memcache::set()。
範例:

 程式碼如下:

$memcache_obj = memcache_connect(”localhost”, 11211);
memcache_add($memcache_obj, 'var_key', 'test variable', false, 30);
$memcache_obj->add('var_key', 'test variable', false, 30);
?>




Memcache::addServer用法

 程式碼如下:
bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int$timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )



說明:
新增一個可供使用的伺服器位址到連接池中,連線用Memcache::addServer打開,腳本執行完後自動關閉,或可以用Memcache::close()手動關閉。相同函式是memcache_add_server()。
當用這個方法的時候(相對於Memcache::connect()和Memcache::pconnect()方法),網路連線只有等需要的時候才會建立,因此不會因為增加很多的伺服器到連線池而增加系統負擔,因為很多伺服器可能沒有使用。
故障復原會發生在這個方法執行的任何階段,只要其他的伺服器是正常的,這些連線請求的失敗使用者不會注意到。任何一種socket或memcached伺服器級的錯誤可以觸發故障復原。正常的客戶端錯誤例如增加一個存在的鍵值不會引發故障復原。

參數:
$host伺服器的位址
$port伺服器連接埠
$persistent是否是一個持久連線
$weight這台伺服器在所有伺服器中所佔的權重
$timeout連線的持續時間
$retry_interval連線重試的間隔時間,預設為15,設定為-1表示不進行重試
$status控制伺服器的線上狀態
$failure_callback允許設定一個回掉函數來處理錯誤訊息。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。

範例:

 程式碼如下:
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2′, 11211);

$memcache_obj = memcache_connect('memcache_host', 11211); # 11211);
?>



Memcache::close用法
bool Memcache::close ( void )

說明:
關閉memcache伺服器連線。這個函數不會關閉長連接,長連接只有在web伺服器關閉或重新啟動的時候才會關閉。相同的函數memcache_close()
傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。
範例:


程式碼如下:
$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_close($memcache_obj);
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$memcache_obj->close_host', 11211);
$memcache_obj->close(); ;



Memcache::connect用法

#程式碼如下:
##bool Memcache::connect ( string $ host [, int $port [, int $timeout ]] )

#說明:
開啟memcached伺服器連接,建立一個到memcached伺服器的連接,用Memcache::connect打開的連線會在腳本執行完畢後自動關閉。你也可以用Memcache::close()去關閉連線。相同的函數是memcache_connect()。
參數:
$host:指向memcached正在收聽的連結的主機,這個參數會有另一個特殊的連接方式unix:///path/to/memcached.sock,即用unix的網域sockets ,這種情況下,端口必須設置為0
$port:指向memcached正在收聽的鏈接的端口,用unix的域名sockets的情況下,端口必須設置為0
$timeout:用於連接守護進程的秒數,當你改變預設的1秒的值的時候,你需要考慮一下,如果你的連線太慢的話,你可能會失去快取的優勢。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。
範例:

程式碼如下:

##
$memcache_obj = memcache_connect('memcache_host', 11211);
$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);

?>


memcache::debug


 程式碼如下:

bool memcache_debug ( bool $on_off )



說明:
控制偵錯功能,前提是php在編譯的時候使用了-enable-debug選項,否則這個函數不會有作用。
參數:
$on_off:true表示開啟偵錯,false表示關閉偵錯
回傳值:
如果php在編譯的時候使用了-enable-debug選項,回傳true,否則回傳false

Memcache::decrement用法

 程式碼如下:
int Memcache::decrement ( string $key [, int $ value ] )



說明:
Memcache::decremen方法的作用是對保存的某個key中的值進行減法操作,用法跟Memcache::increment類似。
你也可以用memcache_decrement()函數。
參數:
Key:想要減少的鍵的名字
Value:想要減少的值。

傳回值:
如果成功,傳回被減少後的值,如果失敗回傳false。
範例:

 程式碼如下:

$memcache = new Memcache;
$memcache-> connect('localhost', 11211);
$memcache->set('test_item', 8);
$memcache->increment('test_item', 4);
echo $memcache- >decrement('test_item', 7);
// 顯示5
?>



這個範例連Memcache::increment函數都一塊示範了。

Memcache::delete用法

#程式碼如下:
bool Memcache::delete ( string $key [, int $timeout ] )



說明:
刪除一個key值,如果參數$timeout被設置,那麼儲存的值會在設定的秒數以後過期,你也可以用函數memcache_delete()

傳回值:
如果成功則傳回TRUE,失敗則傳回FALSE。

範例:

 程式碼如下:


$memcache_obj = memcache_connect('memcache_host', 11211);

memcache_delete($memcache_obj, 'key_to_delete', 10);

$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211); #bmcmmcache_ ->delete('key_to_delete', 10);

?>



Memcache::flush

# 程式碼如下:
bool Memcache::flush ( void )


說明:
清除所有快取的資料。 Memcache::flush實際上沒有釋放資源,它僅僅將所有的快取標記為過期,這樣可以使新的快取來覆蓋被佔據的記憶體空間。一樣的函數是memcache_flush()

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。

範例:


 程式碼如下:

$memcache_obj = memcache_connect('memcache_host' , 11211);

memcache_flush($memcache_obj);

$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
#$memcache_obj->flush();

?>


#Memcache::get


# 程式碼如下:


string Memcache::get ( string $key [, int &$flags ] )
array Memcache::get ( array $keys [, array &$flags ] )




說明:
方法的作用是取得一個key值,key值可以是一個數組,結果會包含鍵值對。

參數:
$key是鍵值或一個鍵的陣列值。
$flags如果這個參數存在,那麼$flags跟寫入這個參數的值相關,這些$flags 類似於Memcache::set()函數裡的$flags。

傳回值:
如果成功,則傳回key對應的值,如果失敗則回傳false.
範例:

 程式碼如下:



$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, 'some_key');

$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get('some_key');

$memcache_obj->get('some_key');
##$memcache_obj->get('some_key');
##$memcache_obj->get('some_key');
##$memcache_obj->get('some_key');
##$memcache_obj->get('some_key');
##$memcache_obj->get('some_key');
##$memcache_objmcg = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));


$memcache_obj = new Meacheache ##ob#mcmmcache_ob ->connect('memcache_host', 11211);
$var = $memcache_obj->get(Array('some_key', 'second_key')); #?>

#Memcache::getExtendedStats
######### 程式碼如下:######array Memcache::getExtendedStats ([ string $type [ , int $slabid [, int $limit ]]] )###



說明:
取得進程池中所有行程的執行系統統計。相同函數是memcache_get_extended_stats()

參數:
$type表示要求傳回的類型:reset, malloc, maps, cachedump, slabs, items, sizes;
$slabid第一個參數設定為”cachedump”時使用的。
$limit第一個參數設定為”cachedump」時所使用的。
回傳值:
如果成功,傳回統計訊息,失敗會回傳false

範例:

程式碼如下:

$memcache_obj = new Memcache;
$memcache_obj->addServer('memcache_host', 11211);
$memcache_obj->addServer('failed_host', 11211);
#$ stats = $memcache_obj->getExtendedStats();
//slabs機制分配管理內存的情況
$statsslab = $memcache_obj->getExtendedStats(slabs);

?>




Memcache::getServerStatus

程式碼如下:
int Memcache::getServerStatus ( string $host [, int $port ] )


說明:
取得執行伺服器的參數。傳回一個伺服器在線或離線的狀態。相同的函數是memcache_get_server_status()

參數:
$host:正在收聽的連接的主機
$port正在收聽的連接的主機的端口,預設是11211

#傳回值:
成功回傳伺服器狀態,伺服器沒有啟動會回傳0,其他數字的時候表示伺服器是啟動狀態的。

範例:

程式碼如下:
$memcache = new Memcache;
$memcache->addServer(' memcache_host', 11211);
echo $memcache->getServerStatus('memcache_host', 11211);

$memcache = memcache_connect('memcache_host', 11211); #mcache_connect('memcache_host', 11211); #mmcache_connity_mmcache_m; , 'memcache_host', 11211);

#?>


#Memcache::getStats


# 程式碼如下:

array Memcache::getStats ([ string $type [, int $slabid [, int $limit ]]] )

說明:
傳回伺服器的一些運行統計資料。相同的函數是memcache_get_stats()

參數:
$type 表示要求傳回的類型:reset, malloc, maps, cachedump, slabs, items, sizes;
$slabid第一個參數設定為”cachedump”時使用的。
$limit第一個參數設定為”cachedump」時所使用的。


Memcache::getVersion


 程式碼如下:

string Memcache::getVersion ( void )

說明:
傳回執行的Memcache的版本資訊。相同函數memcache_get_version()

回傳值:
成功回傳伺服器的版本訊息,失敗的時候回傳false。

範例:

 程式碼如下:

$memcache = new Memcache;
$memcache->connect(' memcache_host', 11211);
echo $memcache->getVersion();

$memcache = memcache_connect('memcache_host', 11211);
echo memcache_get_version($mcache); ?>



Memcache::increment


 程式碼如下:

int Memcache:: increment ( string $key [, int $value ] )
#對儲存的某個key中的值加法運算

用法參考Memcache::decrement



Memcache::pconnect


 程式碼如下:

bool Memcache::pconnect ( string $host [, int $port [ , int $timeout ]] )
說明:

建立一個Memcache的持久連接物件
用法與Memcache::connect()相似,不同點地方是Memcache: :pconnect是建立的持久連結。這個連線在腳本執行完或Memcache::close()函式運行也不會被關閉。與它相同的函數是memcache_pconnect()

參數:
$host:指向memcached正在收聽的連結的主機,這個參數會有另一種特殊的連接方式unix:///path/ to/memcached.sock,即用unix的域名sockets,這種情況下,端口必須設置為0
$port:指向memcached正在收聽的鏈接的端口,用unix的域名sockets的情況下,端口必須設置為0
$timeout:用於連接守護程序的秒數,當你改變預設的1秒的值的時候,你需要考慮一下,如果你的連線太慢的話,你可能會失去快取的優勢。

傳回值:
若成功則回傳 TRUE,失敗則傳回 FALSE

 程式碼如下:



$memcache_obj = memcache_pconnect('memcache_host', 11211);

$mepcmcache_obj = new Memcache;
$memcache_obj-&$mepcmcache_obj = new Memcache;
$memcache_obj-> 'memcache_host', 11211);
?>



#Memcache::replace

#程式碼如下:
bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )




#說明:
對一個已有的key進行覆寫操作。相同函數是memcache_replace()

參數:
$key :將要儲存的鍵值。
$var :儲存的值,字元型和整數會以原值儲存,其他型別自動序列化日後儲存。
$flag:是否用MEMCACHE_COMPRESSED來壓縮儲存的值,true表示壓縮,false表示不壓縮。
$expire:儲存值的過期時間,如果為0表示不會過期,你可以用unix時間戳記或描述來表示從現在開始的時間,但是你在使用秒數表示的時候,不要超過2592000秒(表示30天)。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。如果$key值已經存在,則會傳回FALSE。

程式碼如下:



$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_replace ($memcache_obj, "test_key", "some variable", false, 30);
$memcache_obj->replace("test_key", "some variable", false, 30);
#?> ;




Memcache::set

# 程式碼如下:
bool Memcache: :set ( string $key , mixed $var [, int $flag [, int $expire ]] )




說明:
加一個值,如果已經存在,則覆寫。相同函數是memcache_set()

參數:
$key :將要儲存的鍵值。
$var :儲存的值,字元型和整數會以原值儲存,其他型別自動序列化日後儲存。
$flag:是否用MEMCACHE_COMPRESSED來壓縮儲存的值,true表示壓縮,false表示不壓縮。
$expire:儲存值的過期時間,如果為0表示不會過期,你可以用unix時間戳記或描述來表示從現在開始的時間,但是你在使用秒數表示的時候,不要超過2592000秒(表示30天)。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。

範例:

 程式碼如下:


$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host ', 11211);
$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);
echo $memcache_obj->get('var_key');



#Memcache::setCompressThreshold

# 程式碼如下:
bool Memcache::setCompressThreshold (int $threshold [ , float $min_savings ] )




說明:
對大於某一大小的資料進行壓縮。相同的函數是memcache_set_compress_threshold()

參數:
setCompressThreshold方法有兩個參數,第一個參數表示處理資料大小的臨界點,第二個參數表示壓縮的比例,預設為0.2。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。

範例:
 程式碼如下:



$memcache_obj = new Memcache;
$memcache_obj-> addServer('memcache_host', 11211);
$memcache_obj->setCompressThreshold(20000, 0.2);

$memcache_obj = memcache_connect('memcache_host'
$memcache_obj = memcache_connect('memcache_host', 112111obj = memcache_connect('memcache_host', 1121111]_ob; 20000, 0.2);
?>





#Memcache::setServerParams

# 程式碼如下:
bool Memcache::setServerParams ( string $host [, int $port [, int $timeout [, int$retry_interval [, bool $status [, callback $failure_callback ]]]]] )




說明:
在執行時修改伺服器的參數。相同函式是memcache_set_server_params()。

參數:
$host伺服器的位址
$port伺服器連接埠
$timeout連線的持續時間
$retry_interval連線重試的間隔時間,預設為15,設定為-1表示不進行重試
$status控制伺服器的線上狀態
$failure_callback允許設定一個回掉函數來處理錯誤訊息。

傳回值:
如果成功則傳回 TRUE,失敗則傳回 FALSE。

範例:
 程式碼如下:###


function _callback_memcache_failure($host, $port) {
print "memcache '$host:$port' failed";
}

$memcache = new Memcache;

// 離線模式增加一個伺服器
$memcache->addServer('memcache_host', 11211, false, 1, 1, -1, false);

// 把伺服器設定為線上
$memcache->setServerParams('memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');

$memcache_obj = memcache_failure');

$memcache_obj = memcache_obj = memcache_connect(memcache_obj = mache_connect(meache_connect( 'memcache_host', 11211);
memcache_set_server_params($memcache_obj, 'memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');

?>

六、綜合使用實例
程式碼如下:


#//連結
$mem = new Memcache ;
$mem->connect("db.nowamagic.net", 12000);
//儲存資料
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."
";
/ /替換資料
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "
";
//保存陣列
$arr = array('aaa', 'bbb', 'ccc', 'ddd' );
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value : ";
print_r($val2);
echo "
";
//刪除資料
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "
";
//清除所有資料
$ mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "
";
//關閉連線
$mem->close();

?>

如果正常的話,瀏覽器將輸出:
程式碼如下:


Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 值: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:

Get key2 值:


#七、實例程式碼分析


初始化一個Memcache的物件:$mem = new Memcache;
連接到我們的Memcache伺服器端,第一個參數是伺服器的IP位址,也可以是主機名,第二個參數是Memcache的開放的連接埠:$mem->connect("192.168.0.200", 12000);
儲存一個資料到Memcache伺服器上,第一個參數是數據的key,用來定位一個數據,第二個參數是需要保存的數據內容,這裡是一個字串,第三個參數是一個標記,一般設置為0或者MEMCACHE_COMPRESSED就行了,第四個參數是資料的有效期,就是說資料在這個時間內是有效的,如果過去這個時間,那麼會被Memcache伺服器端清除掉這個數據,單位是秒,如果設定為0,則永遠有效,我們在這裡設定了60,就是一分鐘有效時間:$mem->set('key1', 'This is first value', 0, 60);
從Memcache伺服器端取得一條數據,它只有一個參數,就是需要取得資料的key,我們這裡是上一步設定的key1,現在取得這個資料後輸出輸出:

程式碼如下:

$ val = $mem->get('key1′);

echo "Get key1 值: " . $val;

現在是使用replace方法來取代上面key1的值, replace方法的參數跟set是一樣的,不過第一個參數key1是必須是要替換資料內容的key,最後輸出了:
程式碼如下:


$mem ->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');

echo "Get key1 值: " . $val;

同樣的,Memcache也是可以保存數組的,下面是在Memcache上面保存了一個數組,然後獲取回來並輸出:
 代碼如下:


$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');

print_r($val2);


現在刪除一個數據,使用delte接口,參數就是一個key,然後就能夠把Memcache伺服器這個key的資料刪除,最後輸出的時候沒有結果:

###程式碼如下:###
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "< br />";



最後我們把所有的保存在Memcache伺服器上的資料都清除,會發現資料都沒有了,最後輸出key2的資料為空,最後關閉連線:

程式碼如下:
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 值: ";
print_r($val2);
echo "
";




##什麼時候使用Memcache和Memcache的使用環境
使用Memcache的網站一般流量都是比較大的,為了緩解資料庫的壓力,讓Memcache作為一個快取區域,把部分資訊保存在記憶體中,在前端能夠迅速的進行存取。那麼一般的焦點就是集中在如何分擔資料庫壓力和進行分佈式,畢竟單台Memcache的記憶體容量的有限的。我這裡簡單提出我的個人看法,未經實踐,權當參考。


分散式應用程式
Memcache本來支援分散式,我們客戶端稍加改造,更好的支援。我們的key可以適當進行規律的封裝,例如以user為主的網站來說,每個使用者都有User ID,那麼可以按照固定的ID來進行提取和訪問,例如1開頭的使用者保存在第一台Memcache伺服器上,以2開頭的使用者的資料保存在第二胎Mecache伺服器上,存取資料都先依照User ID來進行對應的轉換與存取。
但這個有缺點,就是需要對User ID進行判斷,如果業務不一致,或者其他類型的應用,可能不是那麼合適,那麼可以根據自己的實際業務來進行考慮,或者去想更合適的方法。


減少資料庫壓力
這個算是比較重要的,所有的資料基本上都是保存在資料庫當中的,每次頻繁的存取資料庫,導致資料庫效能極具下降,無法同時服務更多的用戶,例如MySQL,特別頻繁的鎖表,那麼就讓Memcache來分擔資料庫的壓力吧。我們需要一種改動比較小,並且能夠不會大規模改變前端的方式來進行改變目前的架構。
我考慮的一種簡單方法:
後端的資料庫操作模組,把所有的Select操作提取出來(update/delete/insert不管),然後把對應的SQL進行對應的hash演算法計算得出一個hash數據key(例如MD5或SHA),然後把這個key去Memcache中查找數據,如果這個數據不存在,表示還沒寫入到緩存中,那麼從數據庫把數據提取出來,一個是數組類格式,然後把資料在set到Memcache中,key就是這個SQL的hash值,然後對應的設定一個失效時間,例如一個小時,那麼一個小時中的資料都是從快取中提取的,有效減少資料庫的壓力。缺點是資料不實時,當資料做了修改以後,無法即時到前端顯示,而且還有可能對記憶體佔用比較大,畢竟每次select出來的資料數量可能比較巨大,這個是需要考慮的因素。


Memcache的安全性
我們上面的Memcache伺服器端都是直接透過客戶端連線後直接操作,沒有任何的驗證過程,這樣如果伺服器是直接暴露在網路上的話是比較危險,輕則資料外洩被其他無關人員查看,重則伺服器被入侵,因為Mecache是​​以root權限運行的,況且裡面可能存在一些我們未知的bug或者是緩衝區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。為了安全起見,我做兩點建議,能夠稍微的防止駭客的入侵或資料的外洩。


內網存取
最好把兩台伺服器之間的存取是內網形態的,一般是Web伺服器跟Memcache伺服器之間。普遍的伺服器都是有兩塊網卡,一塊指向互聯網,一塊指向內網,那麼就讓Web伺服器透過內網的網卡來存取Memcache伺服器,我們Memcache的伺服器上啟動的時候就監聽內網的IP位址和端口,內網間的存取能夠有效阻止其他非法的存取。

 代碼如下:
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid


Memcache伺服器端設定監聽通過內網的192.168.0.200的ip的11211端口,佔用1024MB內存,並且允許最大1024個並發連接。

設定防火牆
防火牆是簡單有效的方式,如果卻是兩台伺服器都是掛在網的,並且需要透過外網IP來存取Memcache的話,那麼可以考慮使用防火牆或代理程式來過濾非法存取。一般我們在Linux下可以使用iptables或FreeBSD下的ipfw來指定一些規則防止一些非法的訪問,例如我們可以設定只允許我們的Web伺服器來訪問我們Memcache伺服器,同時阻止其他的訪問。

程式碼如下:
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT

##上面的iptables規則就是只允許192.168.0.2這台伺服器對Memcacheache的存取,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需求來做。

 

 

實戰

//memcached設定

/************************************************ */
$mem_ip='127.0.0.1';
$mem_port=11211;
$mem_prefix='';
/*************************************************/

#/*************************************************/

//session memcached配置,請配置到一個獨立的memcache服務(不同IP或不同連接埠號碼),
//幾個鏡像站都必須設定相同,否則會導致session遺失
//其他任何程式都不能使用這個服務,以免衝突。
/*************************************************/
$session_mem_ip='127.0.0.1';
$session_mem_port=11212;

 

function Instance_Memcached()


 

function Instance_Memcached()

 

function Instance_Memcached()

 

function Instance_Memcached()

### ######function Instance_Memcached()### {### static $mem=false;### if($mem==false && isset($GLOBALS['mem_ip']) && isset($GLOBALS['mem_port']) && extension_loaded('memcache')) ### {### $mem=new Memcache;### $mem->pconnect($GLOBALS['mem_ip'],$GLOBALS['mem_port']) or die('Can not connect to memcache server! ');### }###return $mem;###}###### ####

以上是memcache介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn