導航:首頁 > 使用方法 > memcache使用方法

memcache使用方法

發布時間:2022-12-11 13:25:21

⑴ PHP中的Memcache和memcached的區別 Memcache的操作方法

Memcached和Memcache是Memcached伺服器的擴展


⑵ java中memcache怎麼

1. memcached client for java客戶端API:memcached client for java

引入jar包:java-memcached-2.6.2.jar

package com.pcitc.memcached;

import com.danga.MemCached.*;

public class TestMemcached {
public static void main(String[] args) {
/* 初始化SockIOPool,管理memcached的連接池 */
String[] servers = { "192.168.1.111:11211" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/* 建立MemcachedClient實例 */
MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
/* 將對象加入到memcached緩存 */
boolean success = memCachedClient.set("" + i, "Hello!");
/* 從memcached緩存中按key值取對象 */
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}
}
}

2. spymemcached客戶端API:spymemcached client

引入jar包:spymemcached-2.10.3.jar

package com.pcitc.memcached;

import java.net.InetSocketAddress;
import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MClient {

public static void main(String[] args) {
setValue();
getValue();
}

// 用spymemcached將對象存入緩存
public static void setValue() {
try {
/* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
Future<Boolean> b = null;
/* 將key值,過期時間(秒)和要緩存的對象set到memcached中 */
b = mc.set("neead", 900, "someObject");
if (b.get().booleanValue() == true) {
mc.shutdown();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

// 用spymemcached從緩存中取得對象
public static void getValue() {
try {
/* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
/* 按照key值從memcached中查找緩存,不存在則返回null */
Object b = mc.get("neead");
mc.shutdown();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

3.兩種API比較
memcached client for java:較早推出的memcached JAVA客戶端API,應用廣泛,運行比較穩定。
spymemcached:A simple, asynchronous, single-threaded memcached client written in java. 支持非同步,單線程的memcached客戶端,用到了java1.5版本的concurrent和nio,存取速度會高於前者,但是穩定性不好,測試中常報timeOut等相關異常。
由於memcached client for java發布了新版本,性能上有所提高,並且運行穩定,所以建議使用memcached client for java

⑶ ThinkPHP5.0怎麼使用memcache

'cache' => [
// 驅動方式
'type' => 'memcache',
// 緩存保存目錄
'path' => CACHE_PATH,
// 緩存前綴
'prefix' => '',
// 緩存有效期 0表示永久緩存
'expire' => 0,
],這樣試試吧你看過後很簡單吧以後不會可以向我一樣經常到後盾人平台找找相關教材看看就會了,希望能幫到你,給個採納吧謝謝٩(๑^o^๑)۶

⑷ memcache怎樣清除緩存兩種方法

memcache確實是一個加速很好的緩存器,什麼都可以緩存~
——方法一——-cmd上直接清除,【清除所有緩存】
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
flush_all
OK
quit
Connection to localhost closed by foreign host.

——方法二——-PHP清理緩存方法
<?php
$memcache = new Memcache;
$memcache->connect(『localhost』, 11211) or die (「Could not connect」);
$version = $memcache->getVersion();
echo 」Server』s version: 」.$version.」
\n」;
?>
<?php
$memcache = new Memcache;
$memcache->connect(『localhost』, 11211) or die (「Could not connect」);
print_r($memcache->getStats());
/**
* Array
* (
* [pid] => 8052
* [uptime] => 9205
* [time] => 1205898428
* [version] => 1.2.5 www.shellsec.com
* [pointer_size] => 32
* [rusage_user] => 0.008000
* [rusage_system] => 0.000000
* [curr_items] => 1
* [total_items] => 17
* [bytes] => 57
* [curr_connections] => 2
* [total_connections] => 15
* [connection_structures] => 3
* [cmd_get] => 9
* [cmd_set] => 23
* [get_hits] => 5
* [get_misses] => 4
* [evictions] => 0
* [bytes_read] => 671
* [bytes_written] => 850
* [limit_maxbytes] => 10485760
* [threads] => 1
* )
*/
?>
<?php
$memcache = new Memcache;
$memcache->connect(『localhost』, 11211) or die (「Could not connect」);
$memcache->set( 』name』, 』leo』, 0, 30);
if(!$memcache->add( 』name』, 』susan』, 0, 30))
{
echo 』susan is exist』;
};
$memcache->replace( 』name』, 』lion』, 0, 300);
echo $memcache->get( 』name』);
$memcache->delete( 』name』, 5);
?>
<?php
function _callback_memcache_failure($host, $port) {
print 」memcache 』$host:$port』 failed」;
}
$memcache = new Memcache;
$memcache->addServer(』192.168.1.116′, 11211);
$memcache->setServerParams(』192.168.1.116′, 11211, 1, 15, true,

『_callback_memcache_failure』);
echo $memcache->getServerStatus(』192.168.1.116′, 11211);
?>
<?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
?>

/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P
/tmp/memcached.pid
memcached的服務正式啟動
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 — R對一個已有的key進行覆寫操作
Memcache::set — 添加一個值,如果已經存在,則覆寫
Memcache::setCompressThreshold — 對大於某一大小的數據進行壓縮
Memcache::setServerParams — 在運行時修改伺服器的參數
建議用面向對象的方式來測試這個庫:
Memcache::getVersion方法的作用是返回運行的Memcache的版本信息。
Memcache::getStats 方法的作用是返回伺服器的一些運行統計信息。Memcache::getStats方法有三個參
數,第一個參數表示要求返回的類型:reset, malloc, maps, cachemp, slabs, items, sizes;第二個
參數和第三個參數是在第一個參數設置為「cachemp」時使用的。Memcache::getExtendedStats方法的
作用是獲取進程池中所有進程的運行系統統計。
Memcache::connect方法的作用是創建一個Memcache對象。Memcache::pconnect方法的作用是創建一個
Memcache的持久連接對象。Memcache::close方法的作用是關閉一個Memcache對象。
Memcache::set 方法的作用是添加一個值,Memcache::set方法有四個參數,第一個參數是key,第二個參
數是value,第三個參數可選,表示是否壓縮保存,第四個參數可選,用來設置一個過期自動銷毀的時間
。Memcache::add方法的作用和Memcache::set方法類似,區別是如果 Memcache::add方法的返回值為
false,表示這個key已經存在,而Memcache::set方法則會直接覆寫。 Memcache::get方法的作用是獲取
一個key值,Memcache::get方法有一個參數,表示key。Memcache::replace 方法的作用是對一個已有的
key進行覆寫操作,Memcache::replace方法有四個參數,作用和Memcache::set方法的相同。
Memcache::delete方法的作用是刪除一個key值,Memcache::delete方法有兩個參數,第一個參數表示key
,第二個參數可選,表示刪除延遲的時間。
memcache_debug()函數的作用是控制調試功能,前提是php在編譯的時候使用了–enable-debug選項,否
則這個函數不會有作用。
Memcache::addServer 方法的作用是添加一個可供使用的伺服器地址,Memcache::addServer方法有8個參
數,除了第一個參數意外,其他都是可選的,第一個參數表示伺服器的地址,第二個參數表示埠,第三
個參數表示是否是一個持久連接,第四個參數表示這台伺服器在所有伺服器中所佔的權重,第五個參數表
示連接的持續時間,第六個參數表示連接重試的間隔時間,默認為15,設置為-1表示不進行重試,第七個
參數用來控制伺服器的在線狀態,第8個參數允許設置一個回掉函數來處理錯誤信息。
Memcache::setServerParams方法的作用是在運行時修改伺服器的參數,Memcache::setServerParams方法
有六個參數,Memcache::addServer方法少了第三和第四個參數。 Memcache::getServerStatus方法的作
用是獲取運行伺服器的參數,兩個參數分別表示的地址和埠。
Memcache::flush方法的作用是清除所有緩存的數據,但是不會削去使用的內存空間。
Memcache::increment方法的作用是對保存的某個key中的值進行加法操作,Memcache::decremen方法的作
用是對保存的某個key中的值進行減法操作。

⑸ 怎麼合理的使用memcache緩存如果緩存數據量過大怎麼部署

memcache伺服器,要特殊配置,內存要大,其他硬體能用即可
其他解決方案:可以配置分布式緩存
因為memcache一般是只供區域網使用的
工作原理是:web伺服器使用memcache緩存,然後把數據緩存在memcache伺服器上,memecache只用到內存

數據量過大隻能增加伺服器,部署分布式緩存

其他可以再聯系

⑹ Memcache如何安裝

1、將下載的memcached.exe文件放到磁碟固定的地方,不要刪除。打開開始菜單,在輸入框里輸入cmd按回車。

⑺ 如何在Ubuntu 12.04上安裝和使用Memcache

這個是centos的詳細安裝步驟,ubuntu也差不多。一下參考:PHP程序員,雷雪松的個人博客。
memcached需要libevent支持,所以首先安裝libevent。
解決安裝memcache出現configure: error: libevent is required. If it』s already installed, specify its path using –with-libevent=/dir/
這里要安裝memcached.但在編譯的時候提示需要指定libevent庫,解決辦法如下:
查看系統是否已經安裝libevent
# rpm -qa|grep libevent
如果有,不要高興,先升級
#yum -y install libevent
測試libevent是不是已經安裝成功
#ls -al /usr/lib | grep libevent

可以看到多個已經安裝的類包安裝memcached(http://memcached.org/)
可以先查看編譯參數
# wget http://memcached.googlecode.com/files/memcached-1.4.8.tar.gz
# tar zxvf memcached-1.4.8.tar.gz
# cd memcached-1.4.8
# ./configure -help
# ./configure -prefix=/usr/local/memcached
# make
# make install
在這個時候,不一定會編譯通過,依舊會出現:
checking for libevent directory… configure: error: libevent is required. You can get it from http://www.monkey.org/~provos/libevent/
If it』s already installed, specify its path using –with-libevent=/dir/
因為libevent 這個包是系統默認安裝的,沒有安裝相應的開發所用的頭文件。
所以,還要使用如下命令來安裝:
yum install libevent-devel
再編輯,即可通過。。
啟用Memcached,
/usr/local/memcached/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u root

⑻ 如何在Ubuntu 12.04上安裝和使用Memcache

如何在Ubuntu 12.04上安裝和使用Memcache
關於Memcache
Memcache通過緩存伺服器信息的方式來加速伺服器處理能力的系統。Memcache分配一塊伺服器上的內存來緩存一段特定時間之內的最近的查詢數據。一旦某個數據被再次請求,那麼Memcache就直接從內存中返回這個數據,而不是從資料庫中,所以這將會加速查詢速度。
安裝
安裝前需要用戶具有root許可權。開始安裝前,首先更新系統。
sudo apt-get update
另外,還需要安裝MySQL和PHP。
sudo apt-get install mysql-server php5-mysql php5 php5-memcache
安裝Memcache
首先安裝Memcache。
sudo apt-get install memcached
接著安裝php-pear(PHP擴展和應用庫)。
sudo apt-get install php-pear
如果沒有安裝編譯器,需要安裝build-essential。
sudo apt-get install build-essential
最後使用PECL(PHP擴展社區庫)來安裝Memcache。
sudo pecl install memcache
安裝完成後,向memcache.ini文件中添加memcached:
echo "extension=memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini
現在可以開始使用Memcache了。
確認Memcache並查看其狀態
Memcache運行後,可以通過以下命令查看。
ps aux | grep memcache
另外,還可以查看Memcache的狀態。
echo "stats settings" | nc localhost 11211
Memcache如何工作的?
Memcache可以直接通過代碼來實現從緩存中獲取查詢數據。Memcache獲取數據的過程如下:
function get_foo(foo_id)
foo = memcached_get("foo:" . foo_id)
return foo if defined foo
foo = fetch_foo_from_database(foo_id)
memcached_set("foo:" . foo_id, foo)
return foo
end
簡單的Memcache實例
研究一個簡單的php腳本,該腳本使用Memcache來獲取mysql表中的一個值。
首先登錄到mysql,創建一個表,查詢一些數據。
登錄到mysql: mysql -u root -p
執行下面命令:
use test;
grant all on test.* to test@localhost identified by 'testing123';
create table example (id int, name varchar(30));
insert into example values (1, "new_data");
exit;
退出MySQL後,創建Memcache腳本文件。
nano memtest.php
詳細研究一下memtest.php的腳本文件。
首先創建與Memcache的長連接,使用Memcache的默認埠,11211。
<?php
$meminstance = new Memcache();
$meminstance->pconnect('localhost', 11211);
然後連接到MySQL資料庫
mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
接著創建查詢,然後設置一個標識特定行為的key。
$query = "select id from example where name = 'new_data'";
$querykey = "KEY" . md5($query);
腳本首先查詢緩存,如果結果不存在,則腳本再向原始資料庫查詢。一旦從原始資料庫查詢到結果,則腳本在Memcache中存儲查詢的結果,另外還可以設置緩存的有效期,即表示在這個有效期內,查詢結果一直保持在緩存中(有效期一般是600秒)。
當首次運行腳本時,數據將會從MySQL資料庫中獲取到,此後這些數據會存儲到緩沖中,這樣第二次查詢時,數據就是從緩存中獲取的。
10分鍾後,緩存會被再次清空,再次運行腳本,數據就會從資料庫中獲取。
$result = $meminstance->get($querykey);
if (!$result) {
$result = mysql_fetch_array(mysql_query("select id from example where name = 'new_data'")) or die('mysql error');
$meminstance->set($querykey, $result, 0, 600);
print "got result from mysql\n";
return 0;
}
print "got result from memcached\n";
return 0;
?>
以下是整個的腳本代碼:
<?php
$meminstance = new Memcache();
$meminstance->pconnect('localhost', 11211);
mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
$query = "select id from example where name = 'new_data'";
$querykey = "KEY" . md5($query);
$result = $meminstance->get($querykey);
if (!$result) {
$result = mysql_fetch_array(mysql_query("select id from example where name = 'new_data'")) or die('mysql error');
$meminstance->set($querykey, $result, 0, 600);
print "got result from mysql\n";
return 0;
}
print "got result from memcached\n";
return 0;
?>
運行腳本的執行結果:
# php memtest.php
got result from mysql
# php memtest.php
got result from memcached
# php memtest.php
got result from memcached

⑼ 使用php Memcache模塊如何正確遍歷所有KEY以及VALUE

在php提供的用於與memcached交互的擴展模塊中有memcached與memcache,前者提供方法getAllKeys用於遍歷所有Memcached伺服器上的key,但是並不保證原子操作,而後者卻沒有提供任何方法,雖然在PHP官方
文檔中有人給出使用方法getExtendedStats來間接獲取Memcached伺服器上的所有key,但是給出的代碼是有不少坑的,如果拿來就用,對於cluster的memcached伺服器而言,有些問題就需要指出來。
下面將給出官方文檔中的代碼,並指出可能面臨的問題,代碼如下:
<?php
/**
*Functiontogetallmemcachekeys
*@authorManishPatel
*@Created:28-May-2010
*/
functiongetMemcacheKeys(){

$memcache=newMemcache;
$memcache->connect('127.0.0.1',11211)ordie("");

$list=array();
$allSlabs=$memcache->getExtendedStats('slabs');
$items=$memcache->getExtendedStats('items');
foreach($allSlabsas$server=>$slabs){
foreach($slabsAS$slabId=>$slabMeta){
$cmp=$memcache->getExtendedStats('cachemp',(int)$slabId);
foreach($cmpAS$keys=>$arrVal){
foreach($arrValAS$k=>$v){
echo$k."<br>";
}
}
}
}//EOgetMemcacheKeys()?>
在上述代碼中,如果用於獲取單個memcached伺服器上的key,是不存在任何問題,但是獲取連接池中的多個memcached所有key就存在問題,會發現列印出重復的key,問題就在於當使用getExtendedStats用去特定$slabID
上的信息時,返回的是連接池中所有的伺服器上的特定$slabId的存儲的keys信息。當$server為"127.0.0.1:11214"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}
當$server為"127.0.0.1:11216"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}

⑽ mysql 怎麼使用memcached

一、Memcached簡介

memcached
常被用來加速應用程序的處理,在這里,我們將著重於介紹將它部署於應用程序和環境中的最佳實踐。這包括應該存儲或不應存儲哪些、如何處理數據的靈活分布以
及如何調節用來更新 memcached 和所存儲數據的方法。我們還將介紹對高可用性的解決方案的支持,比如 IBM WebSphere® eXtreme
Scale。

所有的應用程序,特別是很多 web
應用程序都需要優化它們訪問客戶機和將信息返回至客戶機的速度。可是,通常,返回的都是相同的信息。從數據源(資料庫或文件系統)載入數據十分低效,若是每次想要訪問該信息時都運行相同的查詢,就尤顯低效。

雖然很多 web 伺服器都可被配置成使用緩存發回信息,但那與大多數應用程序的動態特性無法相適。而這正是 memcached
的用武之地。它提供了一個通用的內存存儲器,可保存任何東西,包括本地語言的對象,這就讓您可以存儲各種各樣的信息並可以從諸多的應用程序和環境訪問這些信息。

二、基礎知識

memcached 是一個開源項目,旨在利用多個伺服器內的多餘 RAM
來充當一個可存放經常被訪問信息的內存緩存。這里的關鍵是使用了術語緩存:memcached 為載入自他處的信息提供的是內存中的暫時存儲。

比如,考慮這樣一個典型的基於 web 的應用程序。即便是一個動態網站可能也會有一些組件或信息常量是貫穿頁面整個生命周期的。在一個博客站點內,針對單個
blog post
的類別列表不大可能在頁面查看間經常性地變更。每次都通過一個對資料庫的查詢載入此信息相對比較昂貴,特別是在數據沒有更改的情況下,就更是如此。從圖 1
可以看到一個博客站點內可被緩存的頁面分區。

圖1.一個典型的博客頁面內的可緩存元素

將這種結構放在 blog 站點的其他元素,poster 信息、注釋 — 設置 blog post 本身 —
進行推斷,可以看出為了顯示主頁的內容很可能需要發生 10-20 次資料庫查詢和格式化。
每天對數百甚至數千的的頁面查看重復此過程,那麼您的伺服器和應用程序執行的查詢要遠遠多於為了顯示頁面內容所需執行的查詢。

通過使用 memcached,可以將載入自資料庫的格式化信息存儲為一種可直接用在 Web 頁面上的格式。並且由於信息是從 RAM
而不是通過資料庫和其他處理從磁碟載入的,所以對信息的訪問幾乎是瞬時的。

再強調一下,memcached 是一個用來存儲常用信息的緩存,有了它,您便無需從緩慢的資源,比如磁碟或資料庫,載入並處理信息了。

對 memcached 的介面是通過網路連接提供的。這意味著您可以在多個客戶機間共享單個的 memcached
伺服器(或多個伺服器,如本文稍後所示的)。這個網路介面非常迅速,並且為了改善性能,伺服器會故意不支持身份驗證或安全性通信。但這不應限制部署選項。
memcached 伺服器應該存在於您網路的內部。網路介面的實用性以及可以部署多個 memcached 實例的簡便性讓您可以使用多個機器上的多餘 RAM
來提高您緩存的整體大小。

三、存儲方法

memcached 的存儲方法是一個簡單的鍵/值對,類似於很多語言內的散列或關聯數組。通過提供鍵和值來將信息存儲到 memcached
內,通過按特定的鍵請求信息來恢復信息。

信息會無限期地保留在緩存內,除非發生如下的情況:

為緩存分配的內存耗盡 — 在這種情況下,memcached 使用
LRU(最近最少使用)方法從此緩存刪除條目。最近未曾使用的條目會從此緩存中先刪除,最舊的最先訪問。

條目被明確刪除 — 總是可以從此緩存內刪除條目。

條目過期失效 — 各條目均有一個有效的期限以便針對此鍵存儲的信息在過於陳舊時可從緩存中清除這些條目。

上述這些情況可以與您應用程序的邏輯綜合使用以便確保緩存內的信息是最新的。有了這些基礎知識後,讓我們來看看在應用程序內如何能最好地利用
memcached。

四、何時使用memcached?

在使用 memcached 改進應用程序性能時,可以對一些關鍵的過程和步驟進行修改。

在載入信息時,典型的場景如圖 2 所示。

圖2.載入要顯示的信息的典型順序

一般而言,這些步驟是:

執行一個或多個查詢來從資料庫載入信息

格式化適合於顯示(或進一步處理)的信息

使用或顯示格式化了的數據

在使用 memcached 時,為配合這個緩存,可對應用程序的邏輯進行稍許修改:

盡量從緩存載入信息

如果存在,使用信息的被緩存版本

如果它不存在:

執行一個或多個查詢來從資料庫載入信息

格式化適合於顯示或進一步處理的信息

將信息存儲到緩存內

使用格式化了的數據

圖 3 是對這些步驟的總結。

圖3.在使用memcached時載入適合於顯示的信息

數據載入成為了至多三個步驟的一個過程,從緩存載入數據或從資料庫(視情況而定)載入數據並存儲在緩存內。

當這個過程首次發生時,數據將正常地從資料庫或其他數據源載入,然後再存儲到 memcached 內。當下一次訪問此信息時,它就會從 memcached
拉出,而不是從資料庫載入,節省了時間和 CPU 循環。

問題的另一個方面是要確保如果更改了要存儲在 memcached 內的信息,在更新後端信息的同時還要更新 memcached 的版本。這會讓圖 4
內所示的這個典型順序發生稍許變化,如 圖 5 所示。

圖4.在一個典型的應用程序內更新或存儲數據

圖 5 顯示了使用 memcached 後發生了變化的流程。

圖5.在使用memcached時更新或存儲數據

比如,仍以博客站點為例,在博客系統更新資料庫內的類別列表時,更新應該遵循如下順序:

更新資料庫內的類別列表

格式化信息

將信息存儲到 memcached 內

將信息返回至客戶機

memcached 內的存儲操作是原子的,所以信息的更新不會讓客戶機只獲得部分數據;它們獲得的或者是老版本,或者是新版本。

對於大多數應用程序,這兩個操作是您惟一需要注意的。在訪問他人使用的數據時,它會自動被添加到這個緩存內,而且如果對該數據進行了更改,此緩存內也會自動進行更新。

五、鍵、名稱空間和值

memcached
另一個需要重點考慮的因素是如何組織和命名存儲在緩存內的這些數據。從之前博客站點的例子中,不難看出需要使用一種一致的命名結構以便您能載入博客類別、歷史和其他信息,然後再在載入信息(並更新緩存)時或者在更新數據(同樣也要更新緩存)時使用。

使用的何種具體的命名系統特定於應用程序,但通常可以使用一種與現有應用程序類似的結構,並且這種結構很可能基於某種惟一識別符。當從資料庫拉出信息或在整理信息集時,就會發生這種情況。

以 blog post 為例,可以在一個具有鍵 category-list 的項中存儲類別列表。與此 post ID 對應的單個 post,比如
blogpost-29 相關的值都可以使用,而該項的注釋則可以存儲在 blogcomments-29內,其中 29 就是這個 blog post 的
ID。這樣一來, 您就可以將各種各樣的信息存儲在緩存內,使用不同的前綴來標識這些信息。

memcached 鍵/值存儲的簡便性(以及安全性的缺乏)意味著如果您想要在使用同一個 memcached
伺服器的同時支持多個應用程序,那麼就可以考慮使用其他格式的量詞來標識數據屬於某種特定的應用程序。比如,可以添加像 blogapp:blogpost-29
這樣的應用程序前綴。這些鍵是沒有格式的,所以可以使用任何字元串作為鍵的名稱。

在存儲值的方面,應該確保存儲在緩存內的信息適合於您的應用程序。比如,對於這個博客系統,您可能想要存儲被博客應用程序使用的對象以便格式化博客信息,而不是原始的
HTML。如果同一個基礎結構用在應用程序內的多個地方,這一點更具實用性。

大多數語言的介面,包括 Java™、Perl、PHP 等,都能串列化語言對象以便存儲在 memcached
內。這就讓您可以存儲並隨後從內存存儲恢復全部對象,而不是在您的應用程序內手動重構它們。
很多對象,或它們使用的結構,都基於某種散列或數組結構。對於跨語言的環境,比如在 JSP 環境和 JavaScript
環境間共享相同信息,可以使用一種架構中立的格式,比如 JavaScript Object Notation (JSON) 甚或 XML。

六、填充並使用memcached

作為一種開源產品以及一種最初開發用來工作於現有開源環境內的產品,memcached 受大量環境和平台支持。與 memcached
伺服器通信的介面有很多,並常常具有針對所有語言的多個實現。參見參考資料 以獲得常用的庫和工具箱。

要列出所有受支持的介面和環境不太可能,但它們均支持 memcached 協議提供的基礎
API。這些描述已經被簡化並應用在不同語言的上下文內,在這些語言中,使用不同的值可指示錯誤。主要的函數有:

get(key) — 從存儲了特定鍵的 memcached 獲得信息。 如果鍵不存在,就返回錯誤。

set(key, value [, expiry]) —
使用緩存內的標識符鍵存儲這個特定的值。如果鍵已經存在,那麼它就會被更新。期滿時間的單位為秒,並且如果值小於 30 天
(30*24*60*60),那麼就用作相對時間,如果值大於 30 天,那麼就用作絕對時間 (epoch)。

add(key, value [, expiry]) —
如果鍵不存在就將這個鍵添加到緩存內,如果鍵已經存在就返回錯誤。如果您想要顯式地添加一個新鍵而又不會因它已經存在而更新它,那麼這個函數將十分有用。

replace(key, value [, expiry]) — 更新此特定鍵的值,如果鍵不存在就返回一個錯誤。

delete(key [, time]) —
從緩存中刪除此鍵/值對。如果您提供一個時間,那麼添加具有此鍵的一個新值就會被阻塞這個特定的時期。超時讓您可以確保此值總是可以重新讀取自您的數據中心。

incr(key [, value]) — 為特定的鍵增 1 或特定的值。只適用於數值。

decr(key [, value]) — 為特定的鍵減 1 或特定的值,只適用於數值。

flush_all — 讓緩存內的所有當前條目無效(或到期失效)。

比如,在 Perl 內,基本 set 操作可以如清單 1 所示的那樣處理。

清單 1. Perl 內的基本 set 操作

use Cache::Memcached;

my $cache = new Cache::Memcached {

'servers' => [

'localhost:11211',

],

};

$cache->set('mykey', 'myvalue');

Ruby 內的相同的基本操作如清單 2 所示。

清單 2. Ruby 內的基本 set 操作

require 'memcache'

memc = MemCache::new '192.168.0.100:11211'

memc["mykey"] = "myvalue"

在兩個例子中可以看到相同的基本結構:設置 memcached 伺服器,然後分配或設置值。其他的介面也可用,包括適合於 Java
技術的那些介面,讓您可以在 WebSphere 應用程序內使用 memcached。memcached 介面類允許將 Java 對象直接序列化到
memcached 以便於存儲和載入復雜的結構。當在像 WebSphere 這樣的環境內進行部署時,有兩個事情非常重要:服務的彈性(在 memcached
不可用時如何做)以及如何提高緩存存儲量來改進在使用多個應用程序伺服器或在使用像 WebSphere eXtreme Scale
這樣的環境時的性能。我們接下來就來看看這兩個問題。

七、彈性和可用性

有關 memcached
最常見的一個問題是:「若緩存不可用了,會發生什麼情況呢?」正如之前章節中明示的,緩存內的信息不應該成為信息的的惟一資源。必須要能夠從其他位置載入存儲在緩存內的數據。

雖然,無法從緩存訪問信息將會減緩應用程序的性能,但它不應該阻止應用程序的運轉。可能會發生這樣幾個場景:

如果 memcached 服務宕掉,應用程序應該回退到從原始數據源載入信息並對信息進行顯示所需的格式化。此應用程序還應繼續嘗試在 memcached
內載入和存儲信息。

一旦 memcached
伺服器恢復可用,應用程序就應該自動嘗試存儲數據。沒有必要強制重載已緩存了的數據,可以使用標準的訪問來用信息載入和填充緩存。最終,緩存將會被最常用的數據重新填充。

再次重申,memcached 是信息的緩存但並非惟一的數據源。memcached 伺服器不可用不應該是應用程序的終結,雖然這意味著在
memcached 伺服器恢復正常之前性能會有所降低。實際上,memcached
伺服器相對簡單,並且雖然不是絕對無故障的,但它的簡單性的結果就是它很少會出錯。

八、分配緩存

memcached 伺服器只是網路上針對一些鍵存儲值的一個緩存。如果有多台機器,那麼很自然地會想要在所有多餘機器上設置一個 memcached
的實例來提供一個超大的聯網 RAM 緩存存儲。

有了這個想法後,還有一種想當然是需要使用某種分配或復制機制來在機器之間復制鍵/值對。這種方式的問題是如果這么做反而會減少可用的 RAM
緩存,而不是增加。如圖 6 所示,可以看出這里有三個應用程序伺服器,每個伺服器都可以訪問一個 memcached 實例。

圖6.多重memcached實例的不正確使用

盡管每個 memcached 實例都是 1 GB 的大小(產生 3 GB 的 RAM 緩存),但如果每個應用程序伺服器只有其自己的緩存(或者在
memcached 之間存在著數據的復制),那麼整個安裝也仍只能有 1 GB 的緩存在每個實例間復制。

由於 memcached 通過一個網路介面提供信息,因此單個的客戶機可以從它所能訪問的任何一個 memcached
實例訪問數據。如果數據沒有跨每個實例被復制,那麼最終在每個應用程序伺服器上,就可以有 3 GB 的 RAM 緩存可用,如圖 7 所示。

圖7.多重memcached實例的正確使用

這個方法的問題是選擇哪個伺服器來儲存鍵/值對,以及當想要重新獲得一個值時,如何決定要與哪個 memcached
伺服器對話。問題的解決方案就是忽略復雜的東西,比如查找表,或是寄望 memcached 伺服器來為您處理這個過程。而 memcached
客戶機則必須要力求簡單。

memcached 客戶機不必決定此信息,它只需對在存儲信息時指定的鍵使用一個簡單的散列演算法。當想要從一列 memcached
伺服器存儲或獲取信息時,memcached 客戶機就會用一個一致的散列演算法從這個鍵獲取一個數值。舉個例子,鍵 mykey 被轉換成數值 23875
。是保存還是獲取信息無關緊要,這個鍵將總是被用作惟一標識符來從 memcached 伺服器載入,因此在本例中,「mykey」 散列轉化後對應的值總是
23875。

如果有兩個伺服器,那麼 memcached 客戶機將對這個數值進行一個簡單的運算(例如,系數)來決定它應將此值存儲在第一個還是第二個配置了的
memcached 實例上。

當存儲一個值時,客戶機會從這個鍵確定出散列值以及它原來存儲在哪個伺服器上。當獲取一個值時,客戶機會從這個鍵確定出相同的散列值並會選擇相同的伺服器來獲取信息。

如果在每個應用程序伺服器上使用的是相同的伺服器列表(並且順序相同),那麼當需要保存或檢索同一個鍵時,每個應用程序伺服器都將選擇同一個
伺服器。現在,在這個例子中,有 3GB 的 memcached 空間可以共享,而不是同一個 1 GB
的空間的復制,這就帶來了更多的可用緩存,並很有可能會提高有多個用戶情況下的應用程序的性能。

九、如何能不使用memcached?

盡管 memcached 很簡單,但 memcached 實例有時候還是會被不正確地使用。

memcached不是一個資料庫

最常見的 memcached 誤用就是把它用作一個數據存儲,而不是一個緩存。memcached
的首要目的就是加快數據的響應時間,否則數據從其他數據源構建或恢復需要很長時間。一個典型的例子就是從一個資料庫中恢復信息,特別是在信息顯示給用戶前
需要對信息進行格式化或處理的時候。Memcached 被設計用來將信息存儲在內存中以避免每次在數據需要恢復時重復執行相同的任務。

切不可將 memcached 用作運行應用程序所需信息的惟一信息源;數據應總是可以從其他信息源獲取。此外,要記住 memcached
只是一個鍵/值的存儲。不能在數據上執行查詢,或者對內容進行迭代來提取信息。應該使用它來存儲數據塊或對象以備批量使用。

不要緩存資料庫行或文件

雖然可以使用 memcached
存儲載入自資料庫的數據行,但這實際上是查詢緩存,並且大多數資料庫都提供各自的查詢緩存的機制。其他的對象,比如文件系統的圖像或文件的情況與此相同。很多應用程序和
web 伺服器針對此類工作已經有了一些很好的解決方案。

如果在載入和格式化後,使用它來存儲全部信息塊,就可以從 memcached
獲得更多的實用工具和性能上的改善。仍以我們的博客站點為例,存儲信息的最佳點是在將博客類別格式化為對象,甚至是在格式化成 HTML 後。博客頁面的構造可通過從
memcached 載入各個組件(比如 blog post、category list、post history 等)並將完成的 HTML
寫回至客戶機實現。

memcached並不安全

為了確保最佳性能,memcached 並未提供任何形式的安全性,沒有身份驗證,也沒有加密。這意味著對 memcached
伺服器的訪問應該這么處理:一是通過將它們放到應用程序部署環境相同的私有側,二是如果安全性是必須的,那麼就使用 UNIX® socket
並只允許當前主機上的應用程序訪問此 memcached 伺服器。

這多少犧牲了一些靈活性和彈性,以及跨網路上的多台機器共享 RAM 緩存的能力,但這是在目前的情況下確保 memcached
數據安全性的惟一一種解決方案。

十、不要限制自己

除了不應該使用 memcached 實例的情況外,memcached 的靈活性不應忽視。由於 memcached
與應用程序處於相同的架構水平,所以很容易集成並連接到它。並且更改應用程序以便利用 memcached 也並不復雜。此外,由於 memcached
只是一個緩存,所以在出現問題時它不會停止應用程序的執行。如果使用正確的話,它所做的是減輕其餘伺服器基礎設施的負載(減少對資料庫和數據源的讀操
作),這意味著無需更多的硬體就可以支持更多的客戶機。

但請記住,它僅僅是個緩存!

結束語

在本文中,我們了解了 memcached 以及如何最佳地使用它。我們看到了信息如何存儲、如何選擇合理的鍵以及如何選擇要存儲的信息。我們還討論了所有
memcached 用戶都要遇到的一些關鍵的部署問題,包括多伺服器的使用、當 memcached 實例消亡時該怎麼做,以及(也許最為重要的)在哪些情況下不能使用
memcached。

作為一種開源的應用程序並且是目的簡單而直白的應用程序,memcached 的功能和實用性均來自於這種簡單性。通過為信息提供巨大的 RAM
存儲空間、讓它在網路上可用,然後再讓它可通過各種不同的介面和語言訪問到,memcached 可被集成到多種多樣的安裝和環境中。

閱讀全文

與memcache使用方法相關的資料

熱點內容
中式棉襖製作方法圖片 瀏覽:65
五菱p1171故障碼解決方法 瀏覽:858
男士修護膏使用方法 瀏覽:547
電腦圖標修改方法 瀏覽:608
濕氣怎麼用科學的方法解釋 瀏覽:539
910除以26的簡便計算方法 瀏覽:806
吹東契奇最簡單的方法 瀏覽:705
對腎臟有好處的食用方法 瀏覽:100
電腦四線程內存設置方法 瀏覽:514
數字電路通常用哪三種方法分析 瀏覽:17
實訓課程的教學方法是什麼 瀏覽:527
苯甲醇乙醚鑒別方法 瀏覽:84
蘋果手機微信視頻聲音小解決方法 瀏覽:701
控制箱的連接方法 瀏覽:75
用什麼簡單的方法可以去痘 瀏覽:789
快速去除甲醛的小方法你知道幾個 瀏覽:805
自行車架尺寸測量方法 瀏覽:125
石磨子的製作方法視頻 瀏覽:153
行善修心的正確方法 瀏覽:403
土豆燉雞湯的正確方法和步驟 瀏覽:276