<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    HandlerSocket client for java——MySql as NoSQL

    Posted on 2010-11-30 13:51 dennis 閱讀(9019) 評論(4)  編輯  收藏 所屬分類: javamy open-source

        HandlerSocket是日本人 akira higuchi 寫的一個MySql的插件,通過這個插件,你可以直接跟MySql后端的存儲引擎做key-value式的交互,省去了MySql上層的SQL解釋、打開關閉表、創建查詢計劃等CPU消耗型的開銷,按照作者給出的數據可以在數據全部在內存的情況下可以達到75W的QPS查詢。具體信息可以看這篇Blog,中文介紹可以看這篇文章《HandlerSocket in action》。

        這個東西為什么讓我很激動呢?首先性能是程序員的G點,一聽高性能你不由地激動,其次,這也解決了緩存跟數據庫的一致性問題,因為緩存就在數據庫里面,第三,這個東西不僅僅是NoSQL,簡單的CRUD你可以通過HandlerSocket,但是復雜的查詢你仍然可以走MySql,完全符合我們應用的場景,并且從實際測試來看,性能確實非常優秀。但是呢,這個東西的代價也少不了,例如沒有權限檢查(未來可能添加);不能啟用MySql的查詢緩存,否則會導致數據的不一致;協議設計也不合理,使用\t做分隔符,使用\n做換行符,那么你插入或者更新的字段數據就不能含有這些字符,否則行為將不如預期。

       HandlerSocket有一個日本人的java客戶端實現,我去嘗試了下,結果發現這玩意完全不具實用性,封裝的層次非常原始。因此我自己寫了個新的客戶端,這就是本文要介紹的HandlerSocket Client for Java,簡稱hs4j,項目放在了googlecode,代碼的網絡層復用xmemcached,重新實現了協議和上層接口,目前的狀態完全可用,也希望有需要的朋友參與測試。

       項目地址:http://code.google.com/p/hs4j/

        HS4J的使用很簡單,所有的操作都通過HSClient這個接口進行,如我們創建一個客戶端對象:

    import com.google.code.hs4j.HSClient;
    import com.google.code.hs4j.impl.HSClientImpl;

       HSClient hsClient 
    = new HSClientImpl(new InetSocketAddress(9999));

       假設HandlerSocket運行在本地的9999端口,默認的9998是只讀的,9999才是允許讀和寫。HSClient是線程安全的。

       在執行操作前需要先open index:
    import com.google.code.hs4j.IndexSession;

          IndexSession session 
    = hsClient.openIndexSession(db, table,
                                    
    "PRIMARY", columns);

       其中db是數據庫名,table是表名,"PRIMARY"表示使用主鍵索引,columns是一個字符串數組代表你要查詢的字段名稱。這里沒有指定indexid,默認會產生一個indexid,你也可以指定indexid,返回表示一次open-index會話對象,IndexSession同樣是線程安全的。
    IndexSession session = hsClient.openIndexSession(indexid,db, table,
                                    
    "PRIMARY", columns);

       查詢操作通過find方法:
    import java.sql.ResultSet;

                    
    final String[] keys = { "dennis""killme2008@gmail.com" };
                    ResultSet rs 
    = session.find(keys);
                    
    while(rs.next()){
                       String name
    =rs.getString(1);
                       String mail
    =rs.getString(2);
                    }

       find返回的是java.sql.ResultSet,你完全可以像使用jdbc那樣去操作結果集。當然我的簡單實現并不符合JDBC規范,只實現了最常見的一些方法,如getStrng、getLong等。find(keys)方法默認使用的op是"="。其他重載方法可以設置其他類型的op,統一封裝為枚舉類型FindOperator。

       更新操作:
    import com.google.code.hs4j.FindOperator;

       
    int result=session.update(keys, new String[] { "1""dennis",
                                    
    "test@163.com""109" }, FindOperator.EQ);

       keys表示索引的字段列表對應的值數組,通過FindOperator.EQ比較這些值和索引,第二個參數values表示要更新的字段值,這些值跟你在open-index的時候傳入的columns一一對應,最后返回作用的記錄數。

        刪除操作:
       int result= session.delete(new String[] { "dennis" },
                                    FindOperator.EQ)

        HS4J同樣支持連接池,可以在構建客戶端的時候傳入連接池大小:
      //100-connections pool
       HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999),100);

       在open index的時候,會在連接池里所有的連接上都open。并且在連接因為意外情況(如網絡錯誤)斷開的時候,HS4J會自動重連,并在重連成功的情況下自動發送已經open的index,保證應用的操作不受重連影響。

        因為HS4J是我在兩天內寫就的一個東西,可能還有不少隱藏的bug,并且HandlerSocket本身也是個新東西,如果有什么問題或者改進建議,隨時歡迎告訴我,多謝。


      
      


    評論

    # re: HandlerSocket client for java——MySql as NoSQL  回復  更多評論   

    2011-01-04 14:48 by preandpre
    你好,我在google project上沒看到遠嗎,能發我一份嗎preandpre@sina.com

    # re: HandlerSocket client for java——MySql as NoSQL  回復  更多評論   

    2011-01-12 22:53 by dennis
    @preandpre
    在svn里,請自己checkout

    # re: HandlerSocket client for java——MySql as NoSQL  回復  更多評論   

    2011-04-14 09:19 by guangyanhong
    嘻嘻 強烈建議支持JDBC 你這樣寫起代碼來太繁瑣 不實用(只是代碼層面的說,其他還沒有研究過)

    # re: HandlerSocket client for java——MySql as NoSQL  回復  更多評論   

    2012-03-07 22:07 by fangke
    作者的舉例還是太生澀,需要嘗試半天才知道是什么,而且最主要的是那些重栽方法沒有注釋,誰知道都干嘛的?開源還是要好好搞好,至少注釋和說明不需要說很完善,但是要有而且至少能簡單的理解。
    主站蜘蛛池模板: 亚洲线精品一区二区三区影音先锋| 成人免费大片免费观看网站| 日韩a级毛片免费观看| 久久亚洲日韩精品一区二区三区| 成人性生交大片免费看中文| JLZZJLZZ亚洲乱熟无码| 一级做a爱片特黄在线观看免费看 一级做a爱过程免费视 | 在线视频免费观看爽爽爽| 亚洲美女aⅴ久久久91| 日本中文字幕免费高清视频| 久久精品国产亚洲一区二区| 青青青国产手机频在线免费观看| 国产亚洲成av片在线观看| 光棍天堂免费手机观看在线观看 | 亚洲妓女综合网99| 日韩在线免费视频| 在线观看黄片免费入口不卡| 亚洲日本va在线视频观看| 免费视频成人手机在线观看网址| 亚洲欧洲∨国产一区二区三区| 毛片在线播放免费观看| 亚洲国产成人久久综合碰碰动漫3d| 最近中文字幕无免费| 亚洲日韩在线视频| 成人免费视频一区二区三区| 欧洲亚洲综合一区二区三区 | 亚洲hairy多毛pics大全| 免费在线观看黄网站| 中出五十路免费视频| 日本久久久久亚洲中字幕| 男人的好免费观看在线视频| 理论亚洲区美一区二区三区| 亚洲午夜未满十八勿入网站2| 95老司机免费福利| 亚洲AV无码一区二区三区性色| 久久久久无码专区亚洲av| 曰批全过程免费视频在线观看无码 | 桃子视频在线观看高清免费完整| 朝桐光亚洲专区在线中文字幕| 久久被窝电影亚洲爽爽爽| 日本成年免费网站|