本文共 3210 字,大约阅读时间需要 10 分钟。
Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。
图 1. Cassandra 的数据模型图:
下面是关于数据模型实例分析 :
说明:
(1) column family插入数据的方法
(2) Super column family插入数据的方法
从上图可以看出,SCF能够支持5维数据空间(分别为:keyspace,column family,super key, key, column name)。
下面摘自:http://www.justinablog.com/archives/882 可以看到,和上文的描述是一致的!
列(Column)
如果你对“列”的理解来自于关系型数据库,那么很容易产生和我之前一样的误解,以为Cassandra是把关系型数据库的行列进行了某种倒置而得到 的设计。其实不是这样的,Cassandra的列是一组键值对,它的结构如下图所示(事实上,这个数据结构是Cassandra 0.7.0,最新的2.0.3版本中ByteBuffer替代了byte[],long型的日期时间替代了IClock):
使用JSON描述的列结构:
{ "name": "email", "value: "me@example.com", "timestamp": 1274654183103300 }
超级列(Super Column)的结构:
复合键(Composite Keys)
有时我们会遇到不同省份可能有同样的城市名称,或不同的城市有重名的街道,这时使用单一的城市名称或街道名称来作为Key就会无法识别。 Cassandra允许你使用Key1:Key2的结构来存储一对值作为Key,一个常见的例子是使 用<userid:lastupdate>这样的结构来存储用户ID及最后登录时间。下面是一个例子:
HotelByCity (CF) Key: city:state { key: Phoenix:AZ { AZC_043: -, AZS_011: -} key: San Francisco:CA { CAS_021: -} key: New York:NY { NYN_042: -} }
最后让我们来巩固一下Cassandra和关系型数据库的区别吧:
本文参考自《Cassandra: The Definitive Guide》
Colum / Colum Family, SuperColum / SuperColum Family
Column是数据增量最底层(也就是最小)的部分。它是一个包含名称(name)、值(value)和时间戳(timestamp)的三重元组。
下面是一个用JSON格式表示的column:
{ // 这是一个Column
name: "emailAddress",
value: "arin@example.com",
timestamp: 123456789
}
需要注意的是,name和value都是二进制的(技术上指byte[]),并且可以是任意长度。
与HBase相比,除了Colum/Colum Family外,Cassandra还支持SuperColum/SuperColum Family。
SuperColum与Colum的区别就是,标准Column的value是一个“字符串”,而 SuperColumn的value是一个包含多个Column的map,另一个细微的差别是:SuperColumn没有时间戳。
{ // 这是一个SuperColumn
name: "homeAddress",
// 无限数量的Column
value: {
street: {name: "street", value: "1234 x street", timestamp: 123456789},
city: {name: "city", value: "san francisco", timestamp: 123456789},
zip: {name: "zip", value: "94107", timestamp: 123456789},
}
}
Column Family(CF)是某个特定Key的Colum集合,是一个行结构类型,每个CF物理上被存放在单独的文件中。从概念上看,CF像数据库中的Table。
SuperColum Family概念上和Column Family(CF)相似,只不过它是Super Colum的集合。
Colum排序
不同于数据库可以通过Order by定义排序规则,Cassandra取出的数据顺序是总是一定的,数据保存时已经按照定义的规则存放,所以取出来的顺序已经确定了。另外,Cassandra按照column name而不是column value来进行排序。
Cassandra可以通过Colum Family的CompareWith属性配置Colume值的排序,在SuperColum中,则是通过SuperColum Family的CompareSubcolumnsWith属性配置Colum的排序。
Cassandra提供了以下一些选:BytesType,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType, Column name识别成为不同的类型,以此来达到灵活排序的目的。
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6278657.html,如需转载请自行联系原作者