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




目录
相关文章
|
7月前
|
开发者
简述函数和框架的区别
简述函数和框架的区别
42 1
|
2月前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
36 3
|
6月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
61 5
|
关系型数据库 MySQL PHP
MySQL实战基础知识入门(8):SMARTY 二次循环数组的输出方法
MySQL实战基础知识入门(8):SMARTY 二次循环数组的输出方法
75 0
|
存储 SQL 缓存
MySQL数据库系统中的核心组件一共有哪些?底层原理是什么?
MySQL数据库系统中的核心组件一共有哪些?底层原理是什么?
419 0
|
缓存 分布式计算 Hadoop
Spark 原理_运行过程_概念介绍 | 学习笔记
快速学习 Spark 原理_运行过程_概念介绍
137 0
Spark 原理_运行过程_概念介绍 | 学习笔记
|
缓存 自然语言处理 安全
lucene原理及源码解析--核心类(下)
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。具体到这个类就是不管是什么类型的数据,我都把它添加到Document对象里。
|
存储 设计模式 大数据
lucene原理及源码解析--核心类(上)
马云说:大家还没搞清PC时代的时候,移动互联网来了,还没搞清移动互联网的时候,大数据时代来了。 然而,我看到的是:在PC时代搞PC的,移动互联网时代搞移动互联网的,大数据时代搞大数据的,都是同一伙儿人。 我就是一个做业务方向的,而回忆起真正做技术的时光,也就是大数据时代刚来临的时候做搜索了。 搜索用的是solr框架,solr就是包装了lucene实现了近实时索引。所以源头还是lucene。而且lucene是java写的全文检索库,源码是一定要研究一下的。
lucene原理及源码解析--核心类(上)
|
C语言 程序员 编译器
带你读《C编程技巧:117个问题解决方案示例》之三:函数和数组
本书用实用和信息丰富的方法解决C编程问题,涵盖了C编程的各个方面,包括C的基础知识、运算符和表达式、控制语句、递归和用户定义函数。每一章都包含一系列方法,你可以很容易地参考它们,快速找到你想要的答案。
|
Python 数据采集 存储
带你读《Python网络爬虫从入门到实践(第2版)》之二:编写第一个网络爬虫
使用Python编写网络爬虫程序获取互联网上的大数据是当前的热门专题。本书基础部分(第1~7章)主要介绍爬虫的三个步骤——获取网页、解析网页和存储数据,并通过诸多示例的讲解,让读者能够从基础内容开始系统性地学习爬虫技术,并在实践中提升Python爬虫水平。进阶部分(第8~13章)包括多线程的并发和并行爬虫、分布式爬虫、更换IP等,帮助读者进一步提升爬虫水平。项目实践部分(第14~17章)使用本书介绍的爬虫技术对几个真实的网站进行抓取,让读者能在读完本书后根据自己的需求写出爬虫程序。

热门文章

最新文章