莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          xmemcached發布1.1.2 (權重、noreply、spring集成)

          Posted on 2009-06-21 14:19 dennis 閱讀(3234) 評論(8)  編輯  收藏 所屬分類: java
              XMemcached發布1.1.2版本,這一版本仍然是1.1.0版本以來的改進版本,主要的改進如下:

          1.支持設置memcached節點權重,權重高的負載相應比較大。

          2.為部分協議添加noreply選項,memcached 1.2.5引入了noreply支持,部分文本協議(如存儲,刪除,incr/decr等)允許附加設置一個noreply,表示客戶端不要求memcached應答。這一特性利于批量處理。

          3.支持與spring框架的集成

          4.添加verbosity協議,這個協議用于讓客戶端設置memcached的日志輸出級別。

          5.一些細節改進。XMemcached從0.5開始就有重連機制,在連接意外斷開的情況下會不斷地自動重連,不過間隔是10秒,現在改成將間隔縮小為0秒以便客戶端能及時連接。改進了JMX支持,可以通過JMX查看節點權重和動態設置節點權重。

          6.BUG修復,包括:Issue 35、Issue 36、Issue 37、Issue 38等,具體請看這里

          7.去除了對spy-2.4.jar依賴,現在序列化部分已經不再需要spymemcached的這個jar包。


          項目主頁:http://code.google.com/p/xmemcached/
          下載地址:http://code.google.com/p/xmemcached/downloads/list
          wiki地址:http://code.google.com/p/xmemcached/w/list


              下面是關于特性的詳細說明,首先是權重的使用,看例子:
              MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000 localhost:12001"),new int[]{1,3});
              MemcachedClient memcachedClient
          =builder.build();
             
              現在的XMemcachedClientBuilder允許傳入了兩個參數,一個是InetSocketAddress組成的列表,一個是權重的數組,權重數組的元素與列表中的地址一一對應,例如這里就是將"localhost:12000"節點的權重設置為1,而將"localhost:12001"的權重設置為3。同樣在XMemcachedClientMBean中添加了兩個新的方法:

              
          public void addOneServerWithWeight(String server, int weight)
                      
          throws IOException;


              
          /**
               * Set a memcached server's weight
               * 
               * 
          @param server
               * 
          @param weight
               
          */
              
          public void setServerWeight(String server, int weight);

              用于動態添加和修改節點的權重。

              其次,為了支持noreply選項,MemcachedClient接口引入了系列xxxWithNoReply方法,例如
          public abstract void setWithNoReply(final String key, final int exp,
                      
          final Object value) throws InterruptedException, MemcachedException;

              
          public abstract <T> void setWithNoReply(final String key, final int exp,
                      
          final T value, final Transcoder<T> transcoder)
                      
          throws InterruptedException, MemcachedException;

          public abstract void addWithNoReply(final String key, final int exp,
                      
          final Object value) throws InterruptedException, MemcachedException;
          public abstract void replaceWithNoReply(final String key, final int exp,
                      
          final Object value) throws InterruptedException, MemcachedException;
          public void deleteWithNoReply(final String key)
                      
          throws InterruptedException, MemcachedException;

             完整的列表請看changelog.txt, noreply系列方法非常適合于批量處理,比之需要等待memcached應答的效率上提升很多。

             第三,與spring的集成,通過XMemcachedClientFactoryBean可以很方便地與spring框架集成,最簡單的配置如下:
             <bean name="memcachedClient"
                  class
          ="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
                  
          <property name="servers">
                      
          <value>localhost:12000 localhost:12001</value>
                  
          </property>
              
          </bean>
            
             只要設置servers屬性,那么就可以在任何需要的地方引用memcachedClient這個Bean.更完整的配置參考wiki

             第四,引入了對verbosity協議的支持,通過兩個新方法:
              public void setLoggingLevelVerbosity(InetSocketAddress address, int level)
                      
          throws TimeoutException, InterruptedException, MemcachedException;

              
          public void setLoggingLevelVerbosityWithNoReply(InetSocketAddress address,
                      
          int level) throws InterruptedException, MemcachedException;
             
             其中的level就是日志級別。請注意你的memcached版本是否支持這一協議。

              1.1.2是一個承前啟后的版本,按俺的計劃應該還有個1.1.3(專注性能改進和優化),之后才是實現了二進制協議的1.2.0。俺非常希望能有任何人給出任何建議和bug反饋。






          評論

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)  回復  更多評論   

          2009-06-23 17:05 by Joshua Zhu
          圍觀此NB的memcache客戶端之茁壯成長

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)  回復  更多評論   

          2009-06-25 14:37 by ymfans
          不會使用append,prepend還有withNoReply
          都會報decode error,session will be closed,line=ERROR

          請作者賜教,thx

          測試時都會報錯(沒按我預期的結果走):

          memcachedClient.add("hello", 0, "dennis");
          memcachedClient.replace("hello", 0, "dennis");
          memcachedClient.append("hello", " good");
          memcachedClient.prepend("hello", "hello ");
          GetsResponse response = memcachedClient.gets("hello");
          long cas = response.getCas();
          Object value = response.getValue();
          System.out.println(value);




          而withNoReply的方法發現都沒有往里塞值,get(key)報錯并返回null:

          String key = "dksdfasdf";
          String key1 = "dksdfasdf";
          memcachedClient.set(key, 0, "asdfasdf");
          memcachedClient.setWithNoReply(key, 80000, "asdfasdf");
          Thread.sleep(1000);
          System.out.println(memcachedClient.get(key));
          memcachedClient.setWithNoReply(key1, 80000, "asdfasdf");
          memcachedClient.set(key1, 0, "asdfasdf");
          Thread.sleep(1000);
          System.out.println(memcachedClient.get(key1));

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)[未登錄]  回復  更多評論   

          2009-06-25 19:47 by dennis
          @ymfans

          這是因為你的memcached版本不支持append,prepend和noreply,請確認你的memcached版本

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)[未登錄]  回復  更多評論   

          2009-06-25 19:48 by dennis
          @ymfans
          這個問題的另一個方面是在memcached不支持的情況下,出錯信息不友好,不是拋適當的異常,而是斷開,這一點將在下個小版本中改進。

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)  回復  更多評論   

          2009-06-26 14:00 by ymfans
          謝謝,果然是忘了檢查 memcached的版本

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)[未登錄]  回復  更多評論   

          2009-06-26 16:01 by dennis
          @ymfans
          多謝關注,有任何問題和bug請及時反饋,感謝使用。

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)  回復  更多評論   

          2009-11-11 21:13 by bigfanofcpp
          請問:
          我有兩個memcached服務器,a和b
          我寫了兩個非常簡單的客戶端,c1和c2
          c1是支持.net1.1的
          c2是支持.net2.0的

          這兩個客戶端,一個是設置值,一個是讀取值;
          當我在c1中設置的值,在c2中讀取不出來,反之亦然。
          我發現,雖然我配置的是兩臺緩存服務器,但是c1永遠寫緩存服務器a,c2永遠寫緩存服務器b,麻煩你幫我分析下為什么,謝謝,我的qq是10064806,麻煩你了,再次感謝!!

          # re: xmemcached發布1.1.2 (權重、noreply、spring集成)  回復  更多評論   

          2009-11-13 17:37 by dennis
          @bigfanofcpp
          我對.net不懂,無法給出任何建議。我的猜測(僅是猜測),問題可能出在序列化方面,,.net不同版本的序列化是否有什么差別。
          主站蜘蛛池模板: 赤峰市| 饶河县| 左贡县| 舞钢市| 海安县| 新民市| 万宁市| 延川县| 三江| 鱼台县| 莎车县| 临夏县| 泽普县| 呼图壁县| 洛扎县| 六枝特区| 堆龙德庆县| 余江县| 吕梁市| 怀来县| 华阴市| 临海市| 石家庄市| 峨眉山市| 临武县| 基隆市| 宣汉县| 巍山| 浮梁县| 西畴县| 无极县| 紫金县| 贵阳市| 万山特区| 鄂伦春自治旗| 中超| 虎林市| 阳曲县| 怀来县| 大化| 高阳县|