搜尋

memcache介紹

Jul 18, 2017 pm 05:29 PM
memcache

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 . "";



最後我們把所有的保存在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
您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

您應該多久再生一次會話ID?您應該多久再生一次會話ID?Apr 23, 2025 am 12:03 AM

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

如何在PHP中設置會話cookie參數?如何在PHP中設置會話cookie參數?Apr 22, 2025 pm 05:33 PM

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會議的主要目的是什麼?在PHP中使用會議的主要目的是什麼?Apr 22, 2025 pm 05:25 PM

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

您如何在子域中分享會議?您如何在子域中分享會議?Apr 22, 2025 pm 05:21 PM

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具