針對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方法。
- 設置hash算法
- 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碼,提高存儲效率
- set方法
- cache數據讀取操作方法
- 使用get方法從cache服務器獲取一個數據
- 如果寫入時是壓縮的或序列化的,則get的返回會自動解壓縮及反序列化
- get方法有3個重載方法,key是必須的參數,hash碼和value是否字符串是可選參數
- 使用getMulti方法從cache服務器獲取一組數據
- get方法的數組實現,輸入參數keys是一個key數組
- 返回是一個map
- 使用get方法從cache服務器獲取一個數據
- 通過cache使用計數器
- 使用storeCounter方法初始化一個計數器
- 使用incr方法對計數器增量操作
- 使用decr對計數器減量操作
Memcached Client API 優化(草)
實現memcached的遍歷操作
有些應用情況下,需要遍歷memcached服務器中所有被cache的數據,目前memcached client API不支持遍歷操作,需要進行擴展。
實現get時刷新數據過期時間(應用於session,可能需要修改服務器端程序)
當memcached被用作session服務器的時候,需要支持session的access方法,根據最近訪問時間刷新過期時間,目前memcached也不支持該操作,需要進行擴展。