深入浅出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.




目录
相关文章
|
6月前
|
小程序 JavaScript
小程序bindtap 和 catchtap 的区别以及如何使用
小程序bindtap 和 catchtap 的区别以及如何使用
119 0
|
4天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
4月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
45 5
|
6月前
|
SQL 存储 分布式计算
什么是Hive?请简要解释其作用和用途。
什么是Hive?请简要解释其作用和用途。
241 0
|
6月前
|
消息中间件 SQL 并行计算
什么是Flink?请简要解释其概念和特点。
什么是Flink?请简要解释其概念和特点。
70 0
|
存储 JavaScript 前端开发
图解 Google V8 # 05:函数表达式的底层工作机制
图解 Google V8 # 05:函数表达式的底层工作机制
177 0
图解 Google V8 # 05:函数表达式的底层工作机制
|
缓存 分布式计算 Hadoop
Spark 原理_运行过程_概念介绍 | 学习笔记
快速学习 Spark 原理_运行过程_概念介绍
128 0
Spark 原理_运行过程_概念介绍 | 学习笔记
|
Cloud Native 安全 网络架构
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十五)
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理
|
缓存 Kubernetes 监控
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十六)
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理
|
缓存 安全 Cloud Native
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十四)
带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理