假設(shè)我們有3臺(tái)memcached 服務(wù)器,server1 和server2 有3GB 的內(nèi)存空間,server3 有2GB 的內(nèi)存空間.
下面程序說(shuō)明怎么來(lái)創(chuàng)建客戶端.
import com.danga.MemCached.*;
public class MyClass {
// 創(chuàng)建一個(gè) memcached 客戶端對(duì)象
protected static MemCachedClient mcc = new MemCachedClient();
// 創(chuàng)建 memcached連接池
static
{ // 指定memcached服務(wù)地址 String[] servers =
{ "server1.mydomain.com:1121","server2.mydomain.com:1121",
"server3.mydomain.com:1121" };
// 指定memcached服務(wù)器負(fù)載量
Integer[] weights ={ 3, 3, 2 };
// 從連接池獲取一個(gè)連接實(shí)例
SockIOPool pool = SockIOPool.getInstance();
// 設(shè)置服務(wù)器和服務(wù)器負(fù)載量
pool.setServers( servers );
pool.setWeights( weights );
// 設(shè)置一些基本的參數(shù)
//設(shè)置初始連接數(shù)5 最小連接數(shù) 5 最大連接數(shù) 250
//設(shè)置一個(gè)連接最大空閑時(shí)間6小時(shí)
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 設(shè)置主線程睡眠時(shí)間
// 每隔30秒醒來(lái) 然后
// 開(kāi)始維護(hù) 連接數(shù)大小
pool.setMaintSleep( 30 );
// 設(shè)置tcp 相關(guān)的樹(shù)形
// 關(guān)閉nagle算法
// 設(shè)置 讀取 超時(shí)3秒鐘 set the read timeout to 3 secs
// 不設(shè)置連接超時(shí)
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 開(kāi)始初始化 連接池
pool.initialize();
// 設(shè)置壓縮模式
//如果超過(guò)64k壓縮數(shù)據(jù)
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
public static void examples() {
mcc.set( "foo", "This is a test String" );
String bar = mcc.get( "foo" );
}
}
MemCachedClient 類 常用的方法說(shuō)明
創(chuàng)建 client對(duì)象 設(shè)置參數(shù):
MemCachedClient mc = new MemCachedClient();
//壓縮模式
mc.setCompressEnable(true);
// 如果 cache數(shù)據(jù) 大于4 KB 就啟用壓縮
mc.setCompressThreshold(4096);
// 基本類型tostring方法
// 通常不需要設(shè)置
mc.setPrimitiveAsString(true);
存儲(chǔ)一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
mc.set(key, value);
用客戶端hashcode 存儲(chǔ)一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
Integer hash = new Integer(45);
mc.set(key, value, hash);
set方法:在cache中存儲(chǔ)一個(gè)指定對(duì)象
add 和replace 方法功能差不多
add -- 如果不存在 這個(gè)key的對(duì)象,將會(huì)存儲(chǔ)一個(gè)對(duì)象到cache中
replace --只有當(dāng)存在指定key對(duì)象的時(shí)候 會(huì)覆蓋已有對(duì)象
刪除一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
mc.delete(key);
結(jié)合hashcode 刪除一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Integer hash = new Integer(45);
mc.delete(key, hashCode);
怎么cache計(jì)數(shù),增 減計(jì)數(shù):
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
mc.storeCounter(key, new Integer(100));
System.out.println("counter after adding 1: " mc.incr(key));
System.out.println("counter after adding 5: " mc.incr(key, 5));
System.out.println("counter after subtracting 4: " mc.decr(key, 4));
System.out.println("counter after subtracting 1: " mc.decr(key));
利用客戶端的hashcode存儲(chǔ)計(jì)數(shù) 增減 計(jì)數(shù):
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
Integer hash = new Integer(45);
mc.storeCounter(key, new Integer(100), hash);
System.out.println("counter after adding 1: " mc.incr(key, 1, hash));
System.out.println("counter after adding 5: " mc.incr(key, 5, hash));
System.out.println("counter after subtracting 4: " mc.decr(key, 4, hash));
System.out.println("counter after subtracting 1: " mc.decr(key, 1, hash));
獲取一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "key";
Object value = mc.get(key);
用客戶端hashcode獲取一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
從cache 中獲取多個(gè)對(duì)象
MemCachedClient mc = new MemCachedClient();
String[] keys ={ "key", "key1", "key2" };Mapvalues = mc.getMulti(keys);
用客戶端hashcode 從cache中獲取多個(gè)對(duì)象
MemCachedClient mc = new MemCachedClient();
String[] keys = { "key", "key1", "key2" };
Integer[] hashes =
{ new Integer(45), new Integer(32), new Integer(44) };
Mapvalues = mc.getMulti(keys, hashes);
清空所有的對(duì)象
MemCachedClient mc = new MemCachedClient();
mc.flushAll();
得到服務(wù)器memcached的狀態(tài)信息
MemCachedClient mc = new MemCachedClient();
Map stats = mc.stats();
注意點(diǎn)
1:Failover/Failback
當(dāng)一個(gè)memcached服務(wù)器失效的時(shí)候客戶端默認(rèn)會(huì)failover另一個(gè)服務(wù)去.
如果失效的服務(wù)器 恢復(fù)運(yùn)行,客戶端會(huì)返回到原來(lái)連接的服務(wù)器.
如果你不想用這個(gè)功能 設(shè)置下面的參數(shù)
pool.setFailover( false );
pool.setFailback( false );
2:序列化
Boolean
Byte
String
Character
StringBuffer
StringBuilder
Short
Long
Double
Float
Date
java默認(rèn)的類型沒(méi)有實(shí)現(xiàn)序列化 可以設(shè)置
mcc.setPrimitiveAsString( true )替代.
Meetup.com實(shí)踐過(guò)程中得出的一個(gè)經(jīng)驗(yàn) ,項(xiàng)目中model 對(duì)象implement Externalizable 實(shí)現(xiàn)序列化,
可以節(jié)省cache 對(duì)象的大小。從而節(jié)省網(wǎng)絡(luò)帶寬和內(nèi)存空間。
下面程序說(shuō)明怎么來(lái)創(chuàng)建客戶端.
import com.danga.MemCached.*;
public class MyClass {
// 創(chuàng)建一個(gè) memcached 客戶端對(duì)象
protected static MemCachedClient mcc = new MemCachedClient();
// 創(chuàng)建 memcached連接池
static
{ // 指定memcached服務(wù)地址 String[] servers =
{ "server1.mydomain.com:1121","server2.mydomain.com:1121",
"server3.mydomain.com:1121" };
// 指定memcached服務(wù)器負(fù)載量
Integer[] weights ={ 3, 3, 2 };
// 從連接池獲取一個(gè)連接實(shí)例
SockIOPool pool = SockIOPool.getInstance();
// 設(shè)置服務(wù)器和服務(wù)器負(fù)載量
pool.setServers( servers );
pool.setWeights( weights );
// 設(shè)置一些基本的參數(shù)
//設(shè)置初始連接數(shù)5 最小連接數(shù) 5 最大連接數(shù) 250
//設(shè)置一個(gè)連接最大空閑時(shí)間6小時(shí)
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 設(shè)置主線程睡眠時(shí)間
// 每隔30秒醒來(lái) 然后
// 開(kāi)始維護(hù) 連接數(shù)大小
pool.setMaintSleep( 30 );
// 設(shè)置tcp 相關(guān)的樹(shù)形
// 關(guān)閉nagle算法
// 設(shè)置 讀取 超時(shí)3秒鐘 set the read timeout to 3 secs
// 不設(shè)置連接超時(shí)
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 開(kāi)始初始化 連接池
pool.initialize();
// 設(shè)置壓縮模式
//如果超過(guò)64k壓縮數(shù)據(jù)
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
public static void examples() {
mcc.set( "foo", "This is a test String" );
String bar = mcc.get( "foo" );
}
}
MemCachedClient 類 常用的方法說(shuō)明
創(chuàng)建 client對(duì)象 設(shè)置參數(shù):
MemCachedClient mc = new MemCachedClient();
//壓縮模式
mc.setCompressEnable(true);
// 如果 cache數(shù)據(jù) 大于4 KB 就啟用壓縮
mc.setCompressThreshold(4096);
// 基本類型tostring方法
// 通常不需要設(shè)置
mc.setPrimitiveAsString(true);
存儲(chǔ)一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
mc.set(key, value);
用客戶端hashcode 存儲(chǔ)一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
Integer hash = new Integer(45);
mc.set(key, value, hash);
set方法:在cache中存儲(chǔ)一個(gè)指定對(duì)象
add 和replace 方法功能差不多
add -- 如果不存在 這個(gè)key的對(duì)象,將會(huì)存儲(chǔ)一個(gè)對(duì)象到cache中
replace --只有當(dāng)存在指定key對(duì)象的時(shí)候 會(huì)覆蓋已有對(duì)象
刪除一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
mc.delete(key);
結(jié)合hashcode 刪除一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Integer hash = new Integer(45);
mc.delete(key, hashCode);
怎么cache計(jì)數(shù),增 減計(jì)數(shù):
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
mc.storeCounter(key, new Integer(100));
System.out.println("counter after adding 1: " mc.incr(key));
System.out.println("counter after adding 5: " mc.incr(key, 5));
System.out.println("counter after subtracting 4: " mc.decr(key, 4));
System.out.println("counter after subtracting 1: " mc.decr(key));
利用客戶端的hashcode存儲(chǔ)計(jì)數(shù) 增減 計(jì)數(shù):
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
Integer hash = new Integer(45);
mc.storeCounter(key, new Integer(100), hash);
System.out.println("counter after adding 1: " mc.incr(key, 1, hash));
System.out.println("counter after adding 5: " mc.incr(key, 5, hash));
System.out.println("counter after subtracting 4: " mc.decr(key, 4, hash));
System.out.println("counter after subtracting 1: " mc.decr(key, 1, hash));
獲取一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "key";
Object value = mc.get(key);
用客戶端hashcode獲取一個(gè)對(duì)象:
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
從cache 中獲取多個(gè)對(duì)象
MemCachedClient mc = new MemCachedClient();
String[] keys ={ "key", "key1", "key2" };Mapvalues = mc.getMulti(keys);
用客戶端hashcode 從cache中獲取多個(gè)對(duì)象
MemCachedClient mc = new MemCachedClient();
String[] keys = { "key", "key1", "key2" };
Integer[] hashes =
{ new Integer(45), new Integer(32), new Integer(44) };
Mapvalues = mc.getMulti(keys, hashes);
清空所有的對(duì)象
MemCachedClient mc = new MemCachedClient();
mc.flushAll();
得到服務(wù)器memcached的狀態(tài)信息
MemCachedClient mc = new MemCachedClient();
Map stats = mc.stats();
注意點(diǎn)
1:Failover/Failback
當(dāng)一個(gè)memcached服務(wù)器失效的時(shí)候客戶端默認(rèn)會(huì)failover另一個(gè)服務(wù)去.
如果失效的服務(wù)器 恢復(fù)運(yùn)行,客戶端會(huì)返回到原來(lái)連接的服務(wù)器.
如果你不想用這個(gè)功能 設(shè)置下面的參數(shù)
pool.setFailover( false );
pool.setFailback( false );
2:序列化
Boolean
Byte
String
Character
StringBuffer
StringBuilder
Short
Long
Double
Float
Date
java默認(rèn)的類型沒(méi)有實(shí)現(xiàn)序列化 可以設(shè)置
mcc.setPrimitiveAsString( true )替代.
Meetup.com實(shí)踐過(guò)程中得出的一個(gè)經(jīng)驗(yàn) ,項(xiàng)目中model 對(duì)象implement Externalizable 實(shí)現(xiàn)序列化,
可以節(jié)省cache 對(duì)象的大小。從而節(jié)省網(wǎng)絡(luò)帶寬和內(nèi)存空間。
posted on 2010-08-11 23:21 存鷹之心于高遠(yuǎn),取鷹之志而凌云,習(xí)鷹之性以涉險(xiǎn),融鷹之神在山巔. 閱讀(10778) 評(píng)論(1) 編輯 收藏 所屬分類: 架構(gòu)設(shè)計(jì)