`

HandlerSocket client for java——MySql as NoSQL

阅读更多

 

转:http://rdc.taobao.com/team/jm/archives/545

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这个接口进行,如我们创建一个客户端对象:

 

Java代码 复制代码
  1. import com.google.code.hs4j.HSClient;   
  2. import com.google.code.hs4j.impl.HSClientImpl;   

  1.     
  2.    HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999));  
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:

 

Java代码 复制代码
  1. import com.google.code.hs4j.IndexSession;   
  2.     
  3.       IndexSession session = hsClient.openIndexSession(db, table,   
  4.                                 "PRIMARY", columns);  
import com.google.code.hs4j.IndexSession;
 
      IndexSession session = hsClient.openIndexSession(db, table,
                                "PRIMARY", columns);

 其中db是数据库名,table是表名,”PRIMARY”表示使用主键索引,columns是一个字符串数组代表你要查询的字段名称。这里没有指定 indexid,默认会产生一个indexid,你也可以指定indexid,返回表示一次open-index会话对象,IndexSession同样是线程安全的。

 

Java代码 复制代码
  1. IndexSession session = hsClient.openIndexSession(indexid,db, table,   
  2.                                 "PRIMARY", columns);  
IndexSession session = hsClient.openIndexSession(indexid,db, table,
                                "PRIMARY", columns);

 查询操作通过find方法:

 

Java代码 复制代码
  1. import java.sql.ResultSet;   
  2.     
  3.                 final String[] keys = { "dennis""killme2008@gmail.com" };   
  4.                 ResultSet rs = session.find(keys);   
  5.                 while(rs.next()){   
  6.                    String name=rs.getString(1);   
  7.                    String mail=rs.getString(2);   
  8.                 }  
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。

更新操作:

 

Java代码 复制代码
  1. import com.google.code.hs4j.FindOperator;   
  2.     
  3.    int result=session.update(keys, new String[] { "1""dennis",   

  1.                                 "test@163.com""109" }, FindOperator.EQ);  
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一一对应,最后返回作用的记录数。

删除操作:

 

Java代码 复制代码
  1. int result= session.delete(new String[] { "dennis" },   
  2.                              FindOperator.EQ)  
int result= session.delete(new String[] { "dennis" },
                             FindOperator.EQ)

 HS4J同样支持连接池,可以在构建客户端的时候传入连接池大小:

 

Java代码 复制代码
  1. //100-connections pool   
  2.  HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999),100);  

    //100-connections pool
     HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999),100);
    

     在open index的时候,会在连接池里所有的连接上都open。并且在连接因为意外情况(如网络错误)断开的时候,HS4J会自动重连,并在重连成功的情况下自动发送已经open的index,保证应用的操作不受重连影响。

    分享到:
    评论

    相关推荐

      MySQL插件HandlerSocket.zip

      1. 下载源代码:从开源仓库获取HandlerSocket-Plugin-for-MySQL-master压缩包。 2. 解压文件:将下载的zip文件解压到一个目录下。 3. 编译与安装:进入解压后的目录,使用MySQL的编译工具进行编译,然后将生成的库...

      php-handlersocket:一个使用HandlerSocket NoSQL MySQL插件的PECL扩展

      MySQL插件作者的有一些幻灯片。 日本最大的社交游戏平台的数据库基础设施架构师的博客。 另一篇有关在基于RedHat的系统上安装HandlerSocket并使其运行的博客。 使用此PHP扩展在另一篇博客详细介绍。 事实 ...

      基于大数据下的NOSQL和Mysql融合的数据存储模型研究.pdf

      【NOSQL与MySQL融合的数据存储模型】 随着大数据时代的到来,传统的关系型数据库MySQL在处理大规模数据时暴露出一些局限性,如扩展性差、读写速度慢、高昂的成本以及有限的存储容量。NOSQL(Not Only SQL)数据库...

      MySQL HandlerSocket插件安装配置教程

      MySQL HandlerSocket插件是一款由akira higuchi开发的MySQL扩展,它以Daemon Plugin的形式运行,为MySQL提供了类似NoSQL的访问方式。该插件允许用户直接与存储引擎进行键值对交互,绕过了SQL解析、打开关闭表、创建...

      HandlerSocket

      HandlerSocket的应用场景:MySQL自身的局限性,很多站点都采用了MySQL+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/MongoDB等。不可否认,在做一些简单查询(尤其是PK查询)的时候,很多...

      handler socket erlang client

      handlersocket是基于mysql的nosql解决方案,与普通的nosql方案比较,具有更大的灵活性,可以使用mysql的索引。性能相比于mysql的批量操作方式,具有5倍左右的提升(我测试的,可能是内存设置的不多)。 详细内容见此...

      HandlerSocket插件1

      此外,原始的 Java 客户端实现不够实用,因此有开发者基于 xmemcached 重构了网络层,创建了一个新的 Java 客户端库——HS4J,该项目托管在 Google Code。HS4J 提供了更高级别的接口,使得使用 HandlerSocket 更加...

      php-handlersocket

      HandlerSocket是MySQL提供的一种高性能、低延迟的接口,旨在为InnoDB存储引擎提供NoSQL风格的访问方式。通过绕过SQL解析和优化步骤,HandlerSocket能显著提高数据读取和写入的速度,尤其适用于大数据量的实时应用。 ...

      handlersocket-go:一个用于连接HandlerSocket的Go库(github.comahigutiHandlerSocket-Plugin-for-MySQL)

      转到用于连接到HandlerSocket Mysql插件的库。 参见github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/ 安装 $ go get github.com/bketelsen/handlersocket-go 阅读示例-最佳示例在TEST文件中。 hs := New() // ...

      TDH_Socket_Plugin_for_MySQL.zip

      TDH_Socket 是一个MySQL daemon 插件, 类似于HandlerSocket。现在TDH_Socket能接受客户端的TCP请求,并且直接通过MySQL的Handler层访问数据,绕开了SQL解析等一系列逻辑。TDH_Socket的Java客户端可以通过在客户端...

      mysql-handlersocket-1.0.6-1.DC.1.x86_64

      mysql-handlersocket-1.0.6-1.DC.1.x86_64

      HandlerSocket详细介绍

      HandlerSocket是一种开源的高性能数据库缓存系统,它结合了MySQL和memcached的优点,旨在提供一种快速、高效的数据存储和检索方式。HandlerSocket最初由Yoshinori Matsunobu在DeNA公司工作期间开发。DeNA是一家日本...

      常用开源NoSQL原理与应用 Redis、Hash算法、LSM算法、HandlerSocket、分布式数据库 共35页.ppt

      Redis、Hash算法数据库、LSM算法数据库、HandlerSocket、分布式数据库

    Global site tag (gtag.js) - Google Analytics