您的位置:首页 > 编程语言 > Java开发

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

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();

}

}


优点与缺点
优点:简单高效

缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: