Memcached Java Client API詳解
針對Memcached官方網站提供的java_memcached-release_2.0.1版本進行閱讀分析,Memcached Java客戶端lib庫主要提供的調用類是SockIOPool和MemCachedClient?,關鍵類及方法整理說明如下。
SockIOPool
這個類用來創建管理客戶端和服務器通訊連接池,客戶端主要的工作包括數據通訊、服務器定位、hash碼生成等都是由這個類完成的。
public static SockIOPool getInstance()
獲得連接池的單態方法。這個方法有一個重載方法getInstance( String poolName ),每個poolName只構造一個SockIOPool實例。缺省構造的poolName是default。
如果在客戶端配置多個memcached服務,一定要顯式聲明poolName。
public void setServers( String[] servers )
設置連接池可用的cache服務器列表,server的構成形式是IP:PORT(如:127.0.0.1:11211)
public void setWeights( Integer[] weights )
設置連接池可用cache服務器的權重,和server數組的位置一一對應
其實現方法是通過根據每個權重在連接池的bucket中放置同樣數目的server(如下代碼所示),因此所有權重的最大公約數應該是1,不然會引起bucket資源的浪費。
for ( int i = 0; i < servers.length; i+/+ ) { if ( this.weights /!= null && this.weights.length > i ) { for ( int k = 0; k < this.weights[i].intValue(); k+/+ ) { this.buckets.add( servers[i] ); if ( log.isDebugEnabled() ) log.debug( "++++ added " + servers[i] + " to server bucket" ); } }
public void setInitConn( int initConn )
設置開始時每個cache服務器的可用連接數
public void setMinConn( int minConn )
設置每個服務器最少可用連接數
public void setMaxConn( int maxConn )
設置每個服務器最大可用連接數
public void setMaxIdle( long maxIdle )
設置可用連接池的最長等待時間
public void setMaintSleep( long maintSleep )
設置連接池維護線程的睡眠時間
設置為0,維護線程不啟動
維護線程主要通過log輸出socket的運行狀況,監測連接數目及空閑等待時間等參數以控制連接創建和關閉。
public void setNagle( boolean nagle )
設置是否使用Nagle算法,因為我們的通訊數據量通常都比較大(相對TCP控制數據)而且要求響應及時,因此該值需要設置為false(默認是true)
ublic void setSocketTO( int socketTO )
設置socket的讀取等待超時值
public void setSocketConnectTO( int socketConnectTO )
設置socket的連接等待超時值
public void setAliveCheck( boolean aliveCheck )
設置連接心跳監測開關。
設為true則每次通信都要進行連接是否有效的監測,造成通信次數倍增,加大網絡負載,因此該參數應該在對HA要求比較高的場合設為TRUE,默認狀態是false。
public void setFailback( boolean failback )
設置連接失敗恢復開關
設置為TRUE,當宕機的服務器啟動或中斷的網絡連接后,這個socket連接還可繼續使用,否則將不再使用,默認狀態是true,建議保持默認。
public void setFailover( boolean failover )
設置容錯開關
設置為TRUE,當當前socket不可用時,程序會自動查找可用連接並返回,否則返回NULL,默認狀態是true,建議保持默認。
public void setHashingAlg( int alg )
設置hash算法
alg=0 使用String.hashCode()獲得hash code,該方法依賴JDK,可能和其他客戶端不兼容,建議不使用
alg=1 使用original 兼容hash算法,兼容其他客戶端
alg=2 使用CRC32兼容hash算法,兼容其他客戶端,性能優於original算法
alg=3 使用MD5 hash算法
采用前三種hash算法的時候,查找cache服務器使用余數方法。采用最后一種hash算法查找cache服務時使用consistent方法。
public void initialize()
設置完pool參數后最后調用該方法,啟動pool。
MemCachedClient?
public void setCompressEnable( boolean compressEnable )
設定是否壓縮放入cache中的數據
默認值是ture
如果設定該值為true,需要設定CompressThreshold?
public void setCompressThreshold( long compressThreshold )
設定需要壓縮的cache數據的閾值
默認值是30k
public void setPrimitiveAsString( boolean primitiveAsString )
設置cache數據的原始類型是String
默認值是false
只有在確定cache的數據類型是string的情況下才設為true,這樣可以加快處理速度。
public void setDefaultEncoding( String defaultEncoding )
當primitiveAsString為true時使用的編碼轉化格式
默認值是utf-8
如果確認主要寫入數據是中文等非ASCII編碼字符,建議采用GBK等更短的編碼格式
cache數據寫入操作方法
set方法
將數據保存到cache服務器,如果保存成功則返回true
如果cache服務器存在同樣的key,則替換之
set有5個重載方法,key和value是必須的參數,還有過期時間,hash碼,value是否字符串三個可選參數
add方法
將數據添加到cache服務器,如果保存成功則返回true
如果cache服務器存在同樣key,則返回false
add有4個重載方法,key和value是必須的參數,還有過期時間,hash碼兩個可選參數
replace方法
將數據替換cache服務器中相同的key,如果保存成功則返回true
如果cache服務器不存在同樣key,則返回false
replace有4個重載方法,key和value是必須的參數,還有過期時間,hash碼兩個可選參數
建議分析key的規律,如果呈現某種規律有序,則自己構造hash碼,提高存儲效率
cache數據讀取操作方法
使用get方法從cache服務器獲取一個數據
如果寫入時是壓縮的或序列化的,則get的返回會自動解壓縮及反序列化
get方法有3個重載方法,key是必須的參數,hash碼和value是否字符串是可選參數
使用getMulti方法從cache服務器獲取一組數據
get方法的數組實現,輸入參數keys是一個key數組
返回是一個map
通過cache使用計數器
使用storeCounter方法初始化一個計數器
使用incr方法對計數器增量操作
使用decr對計數器減量操作