Memcached 是一個分布式的緩存系統, 但是 Memcachd 到底是什么意思,有什么作用呢?緩存一般用來保存一些經常被存取的數據和資源(例如:瀏覽器會將訪問過的網頁會話緩存起來),因為通過緩存來存取數據要比從磁盤存取同樣的數據要快得多。所以 Memcached 顧名思義,意味着 “內存緩存”,所有緩存的內容都在服務器的內存中。內存中的這些緩存數據可以通過 API 的方式被存取。數據是以 key/value 的配對方式存在的,就像一像大的 Hash 表。
分布式是 Memcached 的主要特性,所以你可以在多台服務器上來安裝 Memcached 來組建一個更大的緩存服務器。這樣一來,Memcached 可以幫助我們使數據庫的壓力降到最低, 從而我們可以構建出更快的、更具擴展性的 WEB 應用。圖一展示了 Memcache 如何與數據庫端協同工作的情況。
Memcache 如何工作?
圖一展示的流程,相信有開發過數據庫應用的同學都不會陌生。我們來一步步的說明圖中發生了什么事情:
- 檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,這時候跟數據庫就完全扯不上關系了。
- 如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。
- 保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。
顯而易見,Memcached 在高並發的數據查詢和海量數據輸出的情況下,可以起到很大的作用。因為訪問 Memcached 中的內存數據,要比數據庫的磁盤數據快的多。
如何安裝 Memcache?
如果你想在自己的服務器上嘗試使用 Memcached,第一步就是要在你的服務器上安裝 Memcached 的相關組件。好在Memcached 在很多服務器的發行版軟件上都已經被預安裝了。你可以通過在 Shell 下執行下面的命令,來檢查你的服務器上有沒有被預安裝了 Memcached:
memcached -h
如果 Memcached 有被安裝過,上面的命令會輸出已經安裝的版本號信息及一些幫助信息,否則則會返回一個錯誤。
下面以 CentOs 發行版為例,簡單介紹一下如何安裝 Memcached。
yum install memcached 上面的命令會在線搜索並安裝最新的 Memcached 包。
Memcache 在什么情況下被使用,什么情況下不要使用?
你在何時應該使用 Memcache,又要在何時避免使用它?現在你已經知道了,Memcahced 是被設計為減輕數據庫端壓力的。但是你最好能制定一個良好的策略,來想辦法讓 Memcached 來盡可能的緩存那些最影響性能的查詢。你可以試着為應用中的所有查詢做一些執行時間日志,可以幫助你來分析哪些內容是要重點被緩存的。
現在假設你正在運營一個電子商務網站。 你可以在 Memcached 中緩存產品的簡介、運送信息,或者其它一些需要復雜查詢的數據,等等。當一個產品頁被加載的時候,上面提到的數據將會跳過數據庫查詢,直接從緩存中取得。 緩存可以大大的改變你的網站整體性能表現,你只需要記得在后台更新產品的時候,把這些緩存一並更新就行了。
還有一些情況下,緩存數據並不是一個好主意,比如在一個數據被頻繁更新的時候,每一次數據的更新,我們都需要去同時更新緩存,緩存的命中率不高,會導致一些額外的性能犧牲。這種情況下,或許直接查數據庫會更好一些。
Memcached 的安全性
如果你了解了 Memcached 的工作流程, 你可能已經注意到了,在訪問緩存的過程中,沒有任何權限控制的相關流程。如果你的數據不是非常重要的,你大可不必擔心這方面的安全問題。如果你需要的話,以下幾點可以協助你更完全的使用它:
- 使用唯一的 Key:因為在 Memcached 中的數據是以一個大的數組形式存在的,所以你應該使用唯一的 key。訪問你的數據的唯一辦法就是通過你保存數據時的 key,除此之外再沒有其它可查詢的辦法。
- 保證你的 Memcached 器安全: 因為 Memcached 本身並沒有身份驗證機制,所以對 Memcached 的服務器查詢,都應該通過防火牆進行。你可以在防火牆上設定規則,哪些服務器是允許被訪問的,哪些是不允許被訪問的。
- 加密你的數據: 你可以將數據和 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 就可以輕松提高你的站點性能,你還等什么?
