http://hi.baidu.com/sunsunsoso/blog/item/b197d6a63193718fd0435814.html
最近一直在做一個項目的前期設計工作,考慮到後期系統的擴充和效能問題也找了很多解決方案,有一個就是用到了資料庫的緩衝工具memcached(當然該工具並不僅僅局限於資料庫的緩衝)。先簡單的介紹下什麼是memcached。
Memcached是高效能的,分布式的記憶體對象緩衝系統,用於在Live App中減少資料庫負載,提升訪問速度。Memcached由Danga Interactive開發,用於提升LiveJournal.com訪問速度的。LJ每秒動態網頁面訪問量幾千次,使用者700萬。Memcached將資料庫負載大幅度降低,更好的分配資源,更快速存取。
上網baidu了很多東西,幾乎都差不多,而且基於java的說的很少,所有只有在研究了各個其他語言類的應用後再來嘗試在java上進行簡單的操作應用。先從memcached上進行說明,memcached的最新版是採用c語言進行開發和設計的,據說舊版的是採用perl語言開發的,而且它是一個應用軟體來的,是作為快取服務器的伺服器端運行在伺服器上的,需要使用特定的語言編寫用戶端與其進行通訊來進行資料的緩衝和擷取。通常我們是把memcached安裝運行在web伺服器上,然後通過對需要的資料進行緩衝,據我目前所知,所有資料的緩衝設定和存取操作,以及資料的更新後替換操作全部需要程式來進行,而不是自動進行的(自動不知道能不能成功,呵呵)。下面從一個實際的例子來應用memcached。
首先到http://danga.com/memcached/下載memcached的windows版本和java用戶端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分別解壓後即可!首先是安裝運行memcached伺服器,我們將memcached-1.2.1-win32.zip解壓後,進入其目錄,然後運行如下命令:
c:>memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start
第一行是安裝memcached成為服務,這樣才能正常運行,否則運行失敗!第一行是啟動memcached的,作為測試我們就簡單的只分配32M記憶體了,然後監聽本機連接埠和以守護進行運行。執行完畢後,我們就可以在工作管理員中見到memcached.exe這個進程了。好了,我們的伺服器已經正常運行了, 下面我們就來寫java的用戶端串連程式。
我們將java_memcached-release_1.6.zip解壓後的目錄中的java_memcached-release_1.6.jar檔案複製到java項目的lib目錄下,然後我們來編寫代碼,比如我提供的一個應用類如下:
package utils.cache;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* 使用memcached的緩衝實用類.
*
* @author 鐵木箱子
*
*/
public class MemCached
{
// 建立全域的唯一執行個體
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCached memCached = new MemCached();
// 設定與快取服務器的串連池
static {
// 伺服器列表和其權重
String[] servers = {"127.0.0.1:11211"};
Integer[] weights = {3};
// 擷取socke串連池的執行個體對象
SockIOPool pool = SockIOPool.getInstance();
// 設定伺服器資訊
pool.setServers( servers );
pool.setWeights( weights );
// 設定初始串連數、最小和最大串連數以及最大處理時間
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 設定主線程的睡眠時間
pool.setMaintSleep( 30 );
// 設定TCP的參數,連線逾時等
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 初始化串連池
pool.initialize();
// 壓縮設定,超過指定大小(單位為K)的資料都會被壓縮
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
/**
* 保護型構造方法,不允許執行個體化!
*
*/
protected MemCached()
{
}
/**
* 擷取唯一執行個體.
* @return
*/
public static MemCached getInstance()
{
return memCached;
}
/**
* 添加一個指定的值到緩衝中.
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value)
{
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry)
{
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value)
{
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry)
{
return mcc.replace(key, value, expiry);
}
/**
* 根據指定的關鍵字擷取對象.
* @param key
* @return
*/
public Object get(String key)
{
return mcc.get(key);
}
public static void main(String[]
args)
{
MemCached cache = MemCached.getInstance();
cache.add("hello", 234);
System.out.print("get value : " + cache.get("hello"));
}
}
那麼我們就可以通過簡單的像main方法中操作的一樣存入一個變數,然後再取出進行查看,我們可以看到先調用了add,然後再進行get,我們運行一次後,234這個值已經被我們存入了memcached的緩衝中的了,我們將main方法中紅色的那一行注釋掉後,我們再運行還是可以看到get到的value也是234,即緩衝中我們已經存在了資料了。
對基本的資料我們可以操作,對於普通的POJO而言,如果要進行儲存的話,那麼比如讓其實現java.io.Serializable介面,因為memcached是一個分布式的快取服務器,多台伺服器間進行資料共用需要將對象序列化的,所以必須實現該介面,否則會報錯的。比如我們寫一個簡單的測試Bean如下:
class TBean implements java.io.Serializable
{
private static final long serialVersionUID = 1945562032261336919L;
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
然後我們在main方法中加入如下幾行代碼:
TBean tb = new TBean();
tb.setName("鐵木箱子");
cache.add("bean", tb);
TBean tb1 = (TBean)cache.get("bean");
System.out.print("name=" + tb1.getName());
tb1.setName("鐵木箱子_修改的");
tb1 = (TBean)cache.get("bean");
System.out.print("name=" + tb1.getName());
我們首先把TBean的一個執行個體放入緩衝中,然後再取出來,並進行名稱的修改,然後我們再取這個對象,我們再看其名稱,發現修改的對象並不是緩衝中的對象,而是通過序列化過來的一個執行個體對象,這樣我們就無須擔心對原生類的無意修改導致快取資料失效了,呵呵~~看來我也是多此一想啊。所以這表明從緩衝中擷取的對象是存入對象的一個副本,對擷取對象的修改並不能真正的修改緩衝中的資料,而應該使用其提供的replace等方法來進行修改。
以上是我在windows下對memcached的一點小學習和實踐,在以後的項目開發過程中將會更深入的學習和應用這一緩衝工具,也希望和有興趣的同行一起討論學習該工具的使用~~