memcache的簡單應用
如今互聯網崛起的時代,各大網站都面臨著一個大數據流問題,怎麽提高網站訪問速度,減少對數據庫的操作;作為PHP開發人員,我們一般能想到的方法有頁面靜態化處理、防盜鏈、CDN內容分發加速訪問、mysql數據庫優化建立索引、架設apache服務器集群、還有就是現在流行的各種分布式緩存技術:如memcached/redis;
1.什麽是Memcached?
a.Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。
b.Memcached的鍵key一般是字符串,該值不能重復;value可以放入字符串、數組、數值、對象、布爾,二進制數據和圖片視頻
c.Memcached默認服務端口是11211
2.PHP使用Memcached步驟
<1>準備:參照配置
<2>開始實踐,memcached主要有crud操作(即創建、讀取、更新、刪除值操作,具體可以查閱手冊),下面弄個簡單的設置值,然後讀取值的操作
a.設置值頁面
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 |
<?php
header( "Content-type:text/html;charset=utf-8" );
//創建Memcache對象
$mem = new Memcache();
//連接Memcache服務器
if (! $mem --->connect( "127.0.0.1" )) {
echo "連接Memcache服務器失敗!" ;
}
//設置,‘myword‘參數代表鍵key,‘hello world‘代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒 if ( $mem ->set( ‘myword‘ , ‘hello world‘ ,MEMCACHE_COMPRESSED,50))
{
echo "設置值成功!" ;
}
?>
|
註:如果值在內存存放的時間要超過30天,要用時間戳來設置100天:如time()+3600*24*100;設置0則表示永不過期
b.讀取值頁面
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 |
<?php
header( "Content-type:text/html;charset=utf-8" );
$mem = new Memcache();
if (! $mem --->connect( "127.0.0.1" )) {
echo "連接Memcache服務器失敗!" ;
}
//讀取鍵myword值
$value = $mem ->get( ‘myword‘ );
if (! $value )
{
echo "讀取失敗!" ;
}
else
{
echo "讀取的值=" . $value ;
}
|
c.刪除、更新例子:
01 02 03 04 05 06 07 08 09 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php
header( "Content-type:text/html;charset=utf-8" );
//創建Memcache對象
$mem = new Memcache();
//連接Memcache服務器
if (! $mem --->connect( "127.0.0.1" )) {
echo "連接Memcache服務器失敗!" ;
}
//設置,‘myword‘參數代表鍵key,‘hello world‘代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒
if ( $mem ->set( ‘myword‘ , ‘hello world‘ ,MEMCACHE_COMPRESSED,50))
{
echo "設置值成功!" ;
}
//讀取鍵myword值
$value = $mem ->get( ‘myword‘ );
if (! $value )
{
echo "讀取失敗!" ;
}
else
{
echo "讀取的值=" . $value ;
}
//更新鍵值
$mem ->replace( ‘myword‘ , ‘hello everybody!‘ );
$value = $mem ->get( ‘myword‘ );
if (! $value )
{
echo "讀取失敗!" ;
}
else
{
echo "讀取的值=" . $value ;
}
//刪除鍵myword值
$mem -> delete ( ‘myword‘ );
$value = $mem ->get( ‘myword‘ );
if (! $value )
{
echo "讀取失敗!" ;
}
else
{
echo "讀取的值=" . $value ;
}
//關閉
$mem ->close();
?>
|
註:mem對象下還有許多方法,可以通過翻閱手冊了解。
<3>多個memcached服務器設置,其實就比一個memcached服務器改變一點點,就是把多個memcached的服務器通過方法addserver添加到連接池中,這樣設置完後,crud操作時,內部就會通過相應算法均衡連接相應服務器並執行相應操作中。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php
header( "Content-type:text/html;charset=utf-8" );
//創建Memcache對象
$mem = new Memcache();
//添加多臺memcached服務器
$mem ->addserver( ‘192.168.0.1‘ ,11211);
$mem ->addserver( ‘192.168.0.2‘ ,11211);
$mem ->addserver( ‘192.168.0.3‘ ,11211);
$mem ->addserver( ‘192.168.0.4‘ ,11211);
//設置,‘myword‘參數代表鍵key,‘hello world‘代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒
if ( $mem ->set( ‘myword‘ , ‘hello world‘ ,MEMCACHE_COMPRESSED,50))
{
echo "設置值成功!" ;
}
//讀取鍵myword值
$value = $mem ->get( ‘myword‘ );
if (! $value )
{
echo "讀取失敗!" ;
}
else
{
echo "讀取的值=" . $value ;
}
?>
|
<4>memcache的訪問是無用戶狀態,安全性需要考慮,一般通過放在內網,並通過防火墻限制外網訪問memcache端口來達到安全
<5>通過修改php.ini,可以把session的值放入memcache服務器中
session.save_handler = files改成session.save_handler = memcached
session.save_path = "N;MODE;/path"改成 session.save_path = "tcp://127.0.0.1:11211"
memcache的簡單應用