cassandra学习笔记4--Cassandra Java客户端
2010-07-03 00:23
302 查看
Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。
对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:ThriftAPI功能过于简单,不具备在生产环境使用的条件。
在CassandraWiki页面上,也有基于ThriftAPI开发的更加高级的API,各个语言都有,具体信息可以参考:http://wiki.apache.org/cassandra/ClientExamples。
这次只谈谈下面两类Java的客户端:
1ThriftJavaAPI
2hector
如果你要使用Cassandra,那么我们必须要了解ThriftAPI,毕竟所有的其他更加高级的API都是基于这个来包装的。
获取某一个keyspace,Key,ColumnFamily,SuperColumn(如果有的话需要指定)下面的相关数据:只查询Column的name符合条件的相关数据(SlicePredicate)。
查询Key的取值范围(使用这个功能需要使用order-preservingpartitioner)。
查询系统的信息。
通过这些操作,我们可以了解到系统的信息。
其中一个比较有意思的查询信息是:tokenmap,通过这个我们可以知道哪些CassandraService是可以提供服务的。
这里需要注意的是,由于一致性的问题。这里的删除操作不会立即删除所有机器上的该数据,但是最终会一致。
优点与缺点
优点:简单高效
缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。
对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:ThriftAPI功能过于简单,不具备在生产环境使用的条件。
在CassandraWiki页面上,也有基于ThriftAPI开发的更加高级的API,各个语言都有,具体信息可以参考:
这次只谈谈下面两类Java的客户端:
1ThriftJavaAPI
2
ThriftJavaAPI
这个是Cassandra自带的最简单的一类API,这个文件在apache-cassandra-0.5.1.jar(现在已经升级到0.6.1版本)中包含了。可以直接使用。我们也可以自己安装一个Thrift,然后通过cassandra.thrift文件自动生成。如果你要使用Cassandra,那么我们必须要了解ThriftAPI,毕竟所有的其他更加高级的API都是基于这个来包装的。
提供的功能
插入数据
插入数据需要指定keyspace,ColumnFamily,Column,Key,Value,timestamp和数据同步级别。/**
*InsertaColumnconsistingof(column_path.column,value,timestamp)atthegivencolumn_path.column_familyandoptional
*column_path.super_column.Notethatcolumn_path.columnishererequired,sinceaSuperColumncannotdirectlycontainbinary
*values--itcanonlycontainsub-Columns.
*
*@paramkeyspace
*@paramkey
*@paramcolumn_path
*@paramvalue
*@paramtimestamp
*@paramconsistency_level
*/
publicvoidinsert(Stringkeyspace,Stringkey,ColumnPathcolumn_path,byte[]value,longtimestamp,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
/**
*InsertColumnsorSuperColumnsacrossdifferentColumnFamiliesforthesamerowkey.batch_mutationisa
*map<string,list<ColumnOrSuperColumn>>--amapwhichpairscolumnfamilynameswiththerelevantColumnOrSuperColumn
*objectstoinsert.
*
*@paramkeyspace
*@paramkey
*@paramcfmap
*@paramconsistency_level
*/
publicvoidbatch_insert(Stringkeyspace,Stringkey,Map<String,List<ColumnOrSuperColumn>>cfmap,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
读取数据
获取一个查询条件精确的值。/**
*GettheColumnorSuperColumnatthegivencolumn_path.Ifnovalueispresent,NotFoundExceptionisthrown.(Thisis
*theonlymethodthatcanthrowanexceptionundernon-failureconditions.)
*
*@paramkeyspace
*@paramkey
*@paramcolumn_path
*@paramconsistency_level
*/
publicColumnOrSuperColumnget(Stringkeyspace,Stringkey,ColumnPathcolumn_path,intconsistency_level)throwsInvalidRequestException,NotFoundException,UnavailableException,TimedOutException,TException;
/**
*Performagetforcolumn_pathinparallelonthegivenlist<string>keys.Thereturnvaluemapskeystothe
*ColumnOrSuperColumnfound.Ifnovaluecorrespondingtoakeyispresent,thekeywillstillbeinthemap,butboth
*thecolumnandsuper_columnreferencesoftheColumnOrSuperColumnobjectitmapstowillbenull.
*
*@paramkeyspace
*@paramkeys
*@paramcolumn_path
*@paramconsistency_level
*/
publicMap<String,ColumnOrSuperColumn>multiget(Stringkeyspace,List<String>keys,ColumnPathcolumn_path,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
获取某一个keyspace,Key,ColumnFamily,SuperColumn(如果有的话需要指定)下面的相关数据:只查询Column的name符合条件的相关数据(SlicePredicate)。
/**
*Getthegroupofcolumnscontainedbycolumn_parent(eitheraColumnFamilynameoraColumnFamily/SuperColumnname
*pair)specifiedbythegivenSlicePredicate.Ifnomatchingvaluesarefound,anemptylistisreturned.
*
*@paramkeyspace
*@paramkey
*@paramcolumn_parent
*@parampredicate
*@paramconsistency_level
*/
publicList<ColumnOrSuperColumn>get_slice(Stringkeyspace,Stringkey,ColumnParentcolumn_parent,SlicePredicatepredicate,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
/**
*Performsaget_sliceforcolumn_parentandpredicateforthegivenkeysinparallel.
*
*@paramkeyspace
*@paramkeys
*@paramcolumn_parent
*@parampredicate
*@paramconsistency_level
*/
publicMap<String,List<ColumnOrSuperColumn>>multiget_slice(Stringkeyspace,List<String>keys,ColumnParentcolumn_parent,SlicePredicatepredicate,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
查询Key的取值范围(使用这个功能需要使用order-preservingpartitioner)。
/**
*@deprecated;useget_range_sliceinstead
*
*@paramkeyspace
*@paramcolumn_family
*@paramstart
*@paramfinish
*@paramcount
*@paramconsistency_level
*/
publicList<String>get_key_range(Stringkeyspace,Stringcolumn_family,Stringstart,Stringfinish,intcount,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
/**
*returnsasubsetofcolumnsforarangeofkeys.
*
*@paramkeyspace
*@paramcolumn_parent
*@parampredicate
*@paramstart_key
*@paramfinish_key
*@paramrow_count
*@paramconsistency_level
*/
publicList<KeySlice>get_range_slice(Stringkeyspace,ColumnParentcolumn_parent,SlicePredicatepredicate,Stringstart_key,Stringfinish_key,introw_count,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
查询系统的信息。
/**
*getpropertywhosevalueisoftypestring.
*
*@paramproperty
*/
publicStringget_string_property(Stringproperty)throwsTException;
/**
*getpropertywhosevalueislistofstrings.
*
*@paramproperty
*/
publicList<String>get_string_list_property(Stringproperty)throwsTException;
/**
*describespecifiedkeyspace
*
*@paramkeyspace
*/
publicMap<String,Map<String,String>>describe_keyspace(Stringkeyspace)throwsNotFoundException,TException;
通过这些操作,我们可以了解到系统的信息。
其中一个比较有意思的查询信息是:tokenmap,通过这个我们可以知道哪些CassandraService是可以提供服务的。
删除数据
/**
*Removedatafromtherowspecifiedbykeyatthegranularityspecifiedbycolumn_path,andthegiventimestamp.Note
*thatallthevaluesincolumn_pathbesidescolumn_path.column_familyaretrulyoptional:youcanremovetheentire
*rowbyjustspecifyingtheColumnFamily,oryoucanremoveaSuperColumnorasingleColumnbyspecifyingthoselevelstoo.
*
*@paramkeyspace
*@paramkey
*@paramcolumn_path
*@paramtimestamp
*@paramconsistency_level
*/
publicvoidremove(Stringkeyspace,Stringkey,ColumnPathcolumn_path,longtimestamp,intconsistency_level)throwsInvalidRequestException,UnavailableException,TimedOutException,TException;
这里需要注意的是,由于一致性的问题。这里的删除操作不会立即删除所有机器上的该数据,但是最终会一致。
程序范例(0.5.1)
importjava.util.List;
importjava.io.UnsupportedEncodingException;
importorg.apache.thrift.transport.TTransport;
importorg.apache.thrift.transport.TSocket;
importorg.apache.thrift.protocol.TProtocol;
importorg.apache.thrift.protocol.TBinaryProtocol;
importorg.apache.thrift.TException;
importorg.apache.cassandra.service.*;
publicclassCClient
{
publicstaticvoidmain(String[]args)
throwsTException,InvalidRequestException,UnavailableException,UnsupportedEncodingException,NotFoundException
{
TTransporttr=newTSocket("localhost",9160);
TProtocolproto=newTBinaryProtocol(tr);
Cassandra.Clientclient=newCassandra.Client(proto);
tr.open();
Stringkey_user_id="逖靖寒的世界";
//insertdata
longtimestamp=System.currentTimeMillis();
client.insert("Keyspace1",
key_user_id,
newColumnPath("Standard1",null,"网址".getBytes("UTF-8")),
"http://gpcuster.cnblogs.com".getBytes("UTF-8"),
timestamp,
ConsistencyLevel.ONE);
client.insert("Keyspace1",
key_user_id,
newColumnPath("Standard1",null,"作者".getBytes("UTF-8")),
"逖靖寒".getBytes("UTF-8"),
timestamp,
ConsistencyLevel.ONE);
//readsinglecolumn
ColumnPathpath=newColumnPath("Standard1",null,"name".getBytes("UTF-8"));
System.out.println(client.get("Keyspace1",key_user_id,path,ConsistencyLevel.ONE));
//readentirerow
SlicePredicatepredicate=newSlicePredicate(null,newSliceRange(newbyte[0],newbyte[0],false,10));
ColumnParentparent=newColumnParent("Standard1",null);
List<ColumnOrSuperColumn>results=client.get_slice("Keyspace1",key_user_id,parent,predicate,ConsistencyLevel.ONE);
for(ColumnOrSuperColumnresult:results)
{
Columncolumn=result.column;
System.out.println(newString(column.name,"UTF-8")+"->"+newString(column.value,"UTF-8"));
}
tr.close();
}
}
优点与缺点
优点:简单高效
缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。
相关文章推荐
- cassandra学习笔记4--Cassandra Java客户端
- cassandra学习笔记4--Cassandra Java客户端
- cassandra学习笔记4--Cassandra Java客户端2
- cassandra学习笔记4--Cassandra Java客户端3
- Cassandra的Java客户端的另一个选择---Pelops
- Cassandra客户端连接的说明---Java版
- Hector——一个高层的Cassandra Java客户端
- 红叶倾城一键网页游戏服务端+客户端(无须安装Java)源码
- hadoop2.0 MapReduce编程(java客户端)
- Java创建WebService服务及客户端实现
- Java Android客户端开发
- java操作cassandra数据库(增删改查)
- Redis源码解析(六):redis之闲话java客户端
- axis将wsdl文件或地址转换成客户端Java代码
- JavaWeb从入门到放弃(9)-实现一个客户端上传文件到服务端
- Memcached Java客户端
- Zookeeper系列(四)Zookeeper客户端(JAVA)API之创建会话
- 使用Java实现B/S系统常见的获取客户端信息功能!
- Zookeeper系列(六)Zookeeper客户端(JAVA)API之创读取子节点列表
- Python服务器与多种客户端(Python/Java/Android)之间的通信