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對計數器減量操作 

Memcached Client API 優化(草)

實現memcached的遍歷操作

有些應用情況下,需要遍歷memcached服務器中所有被cache的數據,目前memcached client API不支持遍歷操作,需要進行擴展。

實現get時刷新數據過期時間(應用於session,可能需要修改服務器端程序)

當memcached被用作session服務器的時候,需要支持session的access方法,根據最近訪問時間刷新過期時間,目前memcached也不支持該操作,需要進行擴展。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM