天天看點

轉:Memcached Java Client API詳解

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也不支援該操作,需要進行擴充。

原文位址:

http://blog.csdn.net/qqiabc521/article/details/6438429

寵辱不驚,看庭前花開花落;去留無意,望天上雲卷雲舒