深入浅出cassandra 2 第一个可以运行的例子

/**
   * author: ahuaxuan(张荣华)
   * date 2010-2-25
   */

深入浅出cassandra 2 第一个可以运行的例子

在上一篇文章中,我们成功的建立了一个可以cassandra的实例,同时也让它成功的运行起来,下面的工作就是让我们来简单的操作一下这个
号称分布式的号称第二代的数据库系统。

 

本文主要关注两个部分,
1. 怎么写一个最简单cassandra的sample
2. 怎么去分析这个最简单的sample背后隐含的含义



步骤一:
首先我们创建一个工程,然后将cassandra/lib目录下的包,导入到我们的工程中。

步骤二:
创建一个类,内容如下:

1./** 
2. * @author: ahuaxuan(张荣华) 
3. * @date: 2010-2-8 10:28:02 
4. * @version: $$id$$ 
5. */  
6.public class SampleOne {  
7.    static Cassandra.Client cassandraClient;  
8.  
9.  
10.    private static void init() throws TTransportException {  
11.        String server = "localhost";  
12.        int port = 9160;  
13.  
14.        /* 首先指定cassandra server的地址 */  
15.        TTransport socket = new TSocket(server, port);  
16.        System.out.println(" connected to " + server + ":" + port + ".");  
17.  
18.  
19.        /* 指定通信协议为二进制流协议 */  
20.        TBinaryProtocol binaryProtocol = new TBinaryProtocol(socket, false, false);  
21.        cassandraClient = new Cassandra.Client(binaryProtocol);  
22.  
23.  
24.        /* 建立通信连接 */  
25.        socket.open();  
26.    }  
27.  
28.  
29.    public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {  
30.        /* 初始化连接 */  
31.        init();  
32.  
33.  
34.        /* 选择需要操作的Keyspaces, 可以理解成数据库的表 */  
35.        String keyspace= "Keyspace1";  
36.        String row = "row007";  
37.  
38.  
39.        /* 创建一个column path */  
40.        ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());  
41.  
42.  
43.        /* 执行插入操作,指定keysapce, row, col, 和数据内容, 后面两个参数一个是timestamp, 另外一个是consistency_level 
44.          * timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo 
45.          */  
46.        cassandraClient.insert(keyspace, row, col, "val1".getBytes(), 1, 1);  
47.  
48.        /* 取出刚刚塞进去的值,取值的流程和插入的流程类似,也需要指定keyspace, row, col, 最后一个参数是consistency_level */  
49.        Column column = cassandraClient.get(keyspace, row, col, 1).column;  
50.  
51.        System.out.println("read row " + row);  
52.        System.out.println("column name" + new String(column.name));  
53.        System.out.println("column value" + ":" + new String(column.value));  
54.        System.out.println("column timestamp" + ":" + (column.timestamp));  
55.    }  
56.}  

好了,代码写到这里,例子里流程非常简单,而且ahuaxuan在例子中也加入了很多注释,估计童鞋们也大概了解了这个cassandra是怎么做insert和get的了

现在可以执行这段代码了,不出意外的话,你们会得到如下结果:

read row row007
column nameahuaxuan
column value: first cassandra sample of ahuaxuan
column timestamp:1

上面说到例子的流程很简单,代码也很少,但是ahuaxuan写这个例子并不只是闲得发慌,也不是无聊得没事可做,真正的目的在于理解这个例子背后的一些模型。

从刚才的这段代码里,估计给大家留下最多烦恼的就是keyspace, row, column, timestamp和consistency_level, 
前面四个概念(keyspace, row, column, timestamp)和数据的存储相关,熟悉的同学估计都知道,这个是来源于bigtable的概念。
而consistency_level则是控制数据分布策略的。由于我们现在的例子只是最简单的而且没有在集群环境下的一个例子,所以consistency_level这个东西我们放在后面,我们先来讲讲
keyspace, row, column, timestamp这四个东西是个什么东西。

1. 首先我们来说说keyspace是个什么玩意
打开storage-conf.xml,找到<Keyspaces>这个xml节点,我们可以看到一段对keyspace的说明, 如下:

ColumnFamily在cassandra中概念最接近关系型数据库中的表。而keyspace则是一堆ColumnFamily的集合。如果说ColumnFamily是表,那么我们可以将keyspace称之库

我们来看一段简单的配置。


1.<Keyspaces>  
2.    <Keyspace Name="Keyspace1">  
3.      <ColumnFamily CompareWith="BytesType" Name="Standard1"/>  
4.      <ColumnFamily CompareWith="UTF8Type" Name="Standard2"/>  
5.      <ColumnFamily CompareWith="TimeUUIDType" Name="StandardByUUID1"/>  
6.      <ColumnFamily ColumnType="Super"  
7.                    CompareWith="UTF8Type"  
8.                    CompareSubcolumnsWith="UTF8Type"  
9.                    Name="Super1"  
10.                    Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>  
11.    </Keyspace>  
12.    <Keyspace Name="ahuaxuan">  
13.      <ColumnFamily CompareWith="BytesType" Name="test1"/>  
14.      <ColumnFamily CompareWith="UTF8Type" Name="test2"/>  
15.      <ColumnFamily ColumnType="Super"  
16.                    CompareWith="UTF8Type"  
17.                    CompareSubcolumnsWith="UTF8Type"  
18.                    Name="Super1"  
19.                    Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>  
20.    </Keyspace>  
21.  </Keyspaces> 


这段配置表示我们的cassandra中有多个keyspace, 而每个keyspace下又有多个

ColumnFamily.


在回头看一下我们的代码是如何使用ColumnFamily的呢?
1./* 创建一个column path */  
2.       ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());  

这行代码指定了我们要数据存放到哪个ColumnFamily中去, 这里的Standard1就是Keyspace1中的第一个ColumnFamily.

但是我们还有一个问题:

cassandraClient.insert(keyspace, row, col, "val1".getBytes(), 1, 1);  

这行代码中第三个参数才是ColumnPath, 第一个参数是keyspace, 两者之间还夹着一个row, 那么row是一个什么样的角色呢?

to be continued.




上一篇:python import 导入两个模块同时有同一名称的方法如何调用 ?


下一篇:优化程序之前,可用Jamon来监测你的Spring应用