/**
* author: ahuaxuan(张荣华)
* date 2010-2-25
*/
深入浅出cassandra 3 例子背后的模型
在上一篇文章中,ahuaxuan和大家一起写了一个cassandra的insert和get的例子。从这个例子中我们也得知了操作cassandra的最基本流程,
除此之外我们也初步了解了cassandra中的数据模型,但是只是肤浅的了解了一下,那么我们接着上一篇的话题,继续阐述这个问题。
在我们操作数据的代码中:
String table = "Keyspace1";
String row = "row007";
ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());
cassandraClient.insert(table, row, col, " first cassandra sample of ahuaxuan".getBytes(), 1, 1);
我们遇到了三个概念,第一个是keyspace, 第二个是ColumnFamily, 第三个是Row。
前面两个属性,我们将可以看成是数据库和表的关系,那么第三个属性呢?
在cassandra文中写道:ColumnFamily的数据是排序后存放在单独的文件中的,row就是排序因子,那个row其实就可以是我们的key,
事实上在cassandra的源代码中row就是key,比如我们看这段源代码:
看上面这个方法的第二个参数,其实就是key.
所以看到这里,我们基本上确定了cassandra中的存储模型,为:
Keyspace1--row007--Standard1,可以确定某个keyspace下的某个key的某个ColumnFamily,
然后再创建某个Column, 包括Column Name和Column Value, 还包含一个timestamp.
这里有一点需要注意, 那就是相同的key中,且在相同的ColumnFamily中,column的名字必须唯一,如果重复,那么可能会产生覆盖。我们来看一段代码
public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {
init();
String table = "Keyspace1";
String row = "row007";
ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());
ColumnPath col2 = new ColumnPath("Standard2", null, "ahuaxuan".getBytes());
cassandraClient.insert(table, row, col, " first cassandra sample of ahuaxuan".getBytes(), 3, 1);
cassandraClient.insert(table, row, col2, " second cassandra sample of ahuaxuan ".getBytes(), 4, 1);
Column column = cassandraClient.get(table, row, col, 1).column;
Column column2 = cassandraClient.get(table, row, col2, 1).column;
System.out.println("read row " + row);
System.out.println("column name: " + new String(column.name));
System.out.println("column value" + ": " + new String(column.value));
System.out.println("column timestamp" + ":" + (column.timestamp));
System.out.println("\r\nread row " + row);
System.out.println("column name: " + new String(column2.name));
System.out.println("column value" + ": " + new String(column2.value));
System.out.println("column timestamp" + ": " + (column2.timestamp));
}
第一次放到Keyspace1--row007--Standard1中,列名为ahuaxuan,列值为first cassandra sample of ahuaxuan,timestamp为3,
接着我更新Keyspace1--row007--Standard1中,列名为ahuaxuan,列值为second cassandra sample of ahuaxuan,timestamp为2
结果更新不成功,但是如果我把timestamp改成4,更新可以成功。
而且从上面这段例子中,我们还可以看出,如果keyspace---row---columnfamily中有一个不一样,那么就不会产生覆盖问题。
所以我们说这里可能产生覆盖,而是否覆盖时由代码中的那个timestamp决定的,如果说当前cassandra中的那条数据的timestamp大于要插入的数据,那么则不会产生覆盖,反之,则产生覆盖
但是本质上未必是覆盖,因为在bigtable的论文中写的很清楚,以前的版本将会被保留,也就是说老的数据还是会存在,当然,我们不能保持所有的老版本数据,那么就一定有一个阈值来
控制具体要保持多少个老版本。其论文写道:
我们对每一个列族支持两个设定,以便于Bigtable对表项的版本自动进行垃圾清除。用户可以指明只保留表项的最后n个版本,或者只保留足够新的版本(比如,只保留最近7天的内容)。
就这样写一个毫无实际意义的例子会让人感觉到比较空洞,所以这里ahuaxuan忍不住引用bigtable论文中的一个例子来描述以下这个模型适用的场景.
如上图所示
当然可以使用这种数据模型的场景很多,很多时候我们可以把它当作key-value系统来使用,由于有版本号的特征,所以它也能解决一部分数据一致性的问题(这个问题非常重要,我们会在后面的文章中详细阐述).
那么接下来的问题是:cassandra是如何实现这个模型的呢,请您接着往下看
to be continued
分享到:
相关推荐
关于Cassandra数据模型的简单介绍
Cassandra分布式模型与源代码分析 分析了Cassandra的分布式模型
Cassandra对象数据模型的安装包中文安装说明 以及使用例子一步到位哦
解Cassandra数据模型
深入研究Cassandra后重读Dynamo
cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战cassandra 实战...
cassandra cql3. pdf
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非...
cassandra cli 命令 大全
Cassandra The Definitive Guide(2nd) 英文azw3 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter...
Laravel开发-cassandra Laravel的Cassandra雄辩模型和查询生成器
Cassandra jdbc driver,支持Cassandra2.x,3.x, 支持标准的jdbc规范,兼容Cassandra的cql语法。
Title: Mastering Apache Cassandra, 2nd Edition Author: Nishant Neeraj Length: 322 pages Edition: 2 Language: English Publisher: Packt Publishing Publication Date: 2015-02-27 ISBN-10: 1784392618 ISBN-...
它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter...
cassandra 学习