国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP中的Memcache詳解

PHP中的Memcache詳解

2020-06-21 16:37服務器之家 PHP教程

這篇文章主要介紹了PHP中的Memcache,從Memcache簡介開始,詳細講解了如Memcache和memcached的區別、PHP的Memcache所有操作方法、每個操作方法的詳細解釋等,需要的朋友可以參考下

一、Memcache簡介
Memcache是danga.com的一個項目,最早是為 LiveJournal 服務的,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力。它可以應對任意多個連接,使用非阻塞的網絡IO。由于它的工作機制是在內存中開辟一塊空間,然后建立一個HashTable,Memcached管理這些HashTable,所以速度非常快。

二、Memcache和memcached的區別

為什么會有Memcache和memcached兩種名稱?其實Memcache是這個項目的名稱,而memcached是它服務器端的主程序文件名,知道我的意思了把~~~~。一個是項目名稱,一個是主程序文件名,在網上看到了很多人不明白,于是混用了。

三、Memcache的服務器端和客戶端安裝

分為兩個過程:memcache服務器端的安裝和memcached客戶端的安裝。

所謂服務器端的安裝就是在服務器(一般都是linux系統)上安裝Memcache實現數據的存儲。

所謂客戶端的安裝就是指php(或者其他程序,Memcache還有其他不錯的api接口提供)去使用服務器端的Memcache提供的函數,需要php添加擴展。

四、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()。
例子:

復制代碼 代碼如下:


<?php
$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。

例子:

復制代碼 代碼如下:

<?php
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2′, 11211);

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_add_server($memcache_obj, 'memcache_host2′, 11211);
?>



Memcache::close用法

bool Memcache::close ( void )

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

復制代碼 代碼如下:


<?php
$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_close($memcache_obj);
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_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。
例子:

復制代碼 代碼如下:


<?php

$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。
例子:

復制代碼 代碼如下:


<?php
$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。

例子:

復制代碼 代碼如下:


<?php

$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);
$memcache_obj->delete('key_to_delete', 10);

?>



Memcache::flush

復制代碼 代碼如下:

bool Memcache::flush ( void )



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

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

例子:

復制代碼 代碼如下:


<?php

$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.
例子:

復制代碼 代碼如下:


<?php

$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 = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));

$memcache_obj = new Memcache;
$memcache_obj->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

例子:

復制代碼 代碼如下:


<?php
$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,其他數字的時候表示服務器是啟動狀態的。

例子:

復制代碼 代碼如下:


<?php
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
echo $memcache->getServerStatus('memcache_host', 11211);

$memcache = memcache_connect('memcache_host', 11211);
echo memcache_get_server_status($memcache, '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。

例子:

復制代碼 代碼如下:


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

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




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

復制代碼 代碼如下:


<?php

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

$memcache_obj = new Memcache;
$memcache_obj->pconnect('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。

復制代碼 代碼如下:


<?php

$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。

例子:

復制代碼 代碼如下:


<?php

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

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_set_compress_threshold($memcache_obj, 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。

例子:

復制代碼 代碼如下:


<?php

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_connect('memcache_host', 11211);
memcache_set_server_params($memcache_obj, 'memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');

?>



六、綜合使用實例

復制代碼 代碼如下:


<?php
//連接
$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 ."<br />";
//替換數據
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//保存數組
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//刪除數據
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有數據
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//關閉連接
$mem->close();
?>



如果正常的話,瀏覽器將輸出:

復制代碼 代碼如下:


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



七、實例程序代碼分析

初始化一個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 value: " . $val;


現在是使用replace方法來替換掉上面key1的值,replace方法的參數跟set是一樣的,不過第一個參數key1是必須是要替換數據內容的key,最后輸出了:

復制代碼 代碼如下:


$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $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 value: ";
print_r($val2);
echo "<br />";




八、什么時候使用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這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产成年免费视频 | 国产精品久久久久久久久久久久冷 | 日韩欧美视频观看 | 欧美在线免费观看 | 在线观看一区二区三区四区 | 综合伊人久久 | 一区视频 | 91久久精品国产 | 国产日韩视频 | 免费在线a | 亚洲福利影院 | 国产欧美日韩在线 | 最新国产视频 | 午夜色电影 | 依人成人网 | 精品成人免费一区二区在线播放 | 久久精品影片 | 国产福利在线视频 | 欧美综合一区 | 久久精品国产99 | 国产福利一区二区三区视频 | 九色在线 | 伊人激情 | 国产成人精品免高潮在线观看 | 中日韩午夜理伦电影免费 | 综合久久99| 伊人草 | 日韩高清电影 | 亚洲一区在线免费观看 | 欧美精品在线一区 | 黄色网页在线 | 国产麻豆91视频 | 亚洲精品字幕 | 亚洲精品一区二区三区蜜桃久 | 黄网站在线观看 | 色综合天天天天做夜夜夜夜做 | 91在线视频播放 | 一级黄色片视频 | 久久综合九色综合网站 | 欧美日韩精品一区二区三区 | 久久爱综合 |