Cassandra 的数据存储结构

Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。

图 1. Cassandra 的数据模型图:

  1. Cassandra 的数据模型的基本概念:
  2. Cluster : Cassandra 的节点实例,它可以包含多个 Keyspace
  3. Keyspace : 用于存放 ColumnFamily 的容器,相当于关系数据库中的 Schema 或 database——类似mongodb里的namespace use xxx;
  4. ColumnFamily : 用于存放 Column 的容器,类似关系数据库中的 table 的概念
  5. SuperColumn :它是一个特列殊的 Column, 它的 Value 值可以包函多个 Column
  6. Columns:Cassandra 的最基本单位。由 name , value , timestamp 组成

下面是关于数据模型实例分析 :

图 2. 数据模型实例分析

说明:

(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和关系型数据库的区别吧:

  • 没有查询语言:No SQL (Structured Query Language);
  • 没有外键约束:关系型数据库的最重要特征;
  • 双重簇索引:在关系型数据库中,每个表只能指定一个簇索引,其它的索引查询都会导致全表扫描,但在Cassandra中,我们可以有第二级的簇索引;
  • 排序是在设计时决策:Cassandra不支持Order By,排序是需要设计时考虑,而不是像在关系型数据库查询时刻使用Order By;
  • 无数据结构约定:这是Cassandra最大的优势,在关系型数据库中,我们设计数据库结构时总是慎之又慎,但在Cassandra中不需要预先约定数据结构。

本文参考自《Cassandra: The Definitive Guide》

Cassandra数据模型

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识别成为不同的类型,以此来达到灵活排序的目的。

转载于:https://www.cnblogs.com/bonelee/p/6278657.html

Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue相关推荐

  1. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  2. solr中文搜索倒排索引和数据存储结构

    solr中文搜索倒排索引和数据存储结构 我们传统的方式(正排索引)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,既通过KEY寻找VALUE.而Lucene的搜索则是 ...

  3. 【MongoDB】——数据存储结构与基本数据类型

    MongoDB数据存储结构 1.基本概念 在MongoDB中数据存储的基本概念是数据库.集合.文档. 文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行 ...

  4. 【mysql】-【innodb数据存储结构】

    文章目录 数据库的存储结构:页 磁盘与内存交互基本单位:页 页结构概述 页的大小 页的上层结构 页的内部结构 File Header(文件头部)和File Trailer(文件尾部) File Hea ...

  5. MySQL笔记:第07章_InnoDB数据存储结构

    第07章_InnoDB数据存储结构 1.数据库的存储结构:页 1.1磁盘与内存交互基本单位:页 1.2页结构概述 1.3页的大小 1.4页的上层结构 2.页的内部结构 第1部分:File Header ...

  6. pg数据库表存放在哪里_超详细的PG数据存储结构--逻辑结构和物理存储总结,值得收藏...

    概述 今天主要讲讲PG的数据结构,PG数据存储结构分为:逻辑结构和物理存储. 其中逻辑存储结构是内部的组织和管理数据的方式.物理存储结构是操作系统中组织和管理数据的方式.逻辑存储结构适用于不同的操作系 ...

  7. Arduino ESP32 flash数据存储结构

    Arduino ESP32 flash数据存储结构 分区表官方文档:<分区表> 想了解ESP32 flash数据存储结构需要从分区表开始了解.一点类似一台电脑上挂载的硬盘一样. 分区表保存 ...

  8. 几种数据存储结构详解

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 影响空间 ...

  9. (八)InnoDB数据存储结构

    InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...

最新文章

  1. Nginx的events块指令的配置使用
  2. [css] 写一个高度从0到auto的transition动画
  3. 大型网站架构设计系列总结
  4. [置顶] 自己动手写Web容器之TomJetty之六:动态页面引入
  5. Spring中都用到了哪些设计模式
  6. 机器人赛文_动漫中机器人赛文与真正的赛文奥特曼相比,谁更厉害呢?
  7. springboot获取Spring容器中的bean(ApplicationContextAware接口的应用)避免过多的或不用if..else,switch
  8. IEEE 研究类型 小木虫
  9. 小程序和H5 之间的通信
  10. 语音信号处理的过程及其应用
  11. YuxuanSys WMS412无线流媒体网关在会议场景中的应用一
  12. 两个无线路由器dhcp服务器,两个无线路由器怎么桥接
  13. 百姓基因:关于历史和名人形象的亲子DNA测试
  14. 戴尔微型计算机3048,戴尔5460一体机拆解,戴尔3048一体机
  15. 【C语言】编程初学者入门训练(7)
  16. 自己动手写CPU(11)——加载存储指令说明
  17. 云原生:打造「阿拉丁神灯式」应用厨房
  18. 2019.8.22 1.属性
  19. STM32 Simulink 自动代码生成电机控制:基于反电动势观测器的锁相环设计
  20. 长文本口语语义理解技术系列①:段落分割实践

热门文章

  1. 计算机网络离不开光缆,九年级物理全册 第二十一章 第四节 越来越宽的信息之路习题课件 新人教版.ppt...
  2. mongo里的type_MongoDB $type 操作符
  3. java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
  4. mysql5.7单机多实例_Mysql 5.7.21单机多实例安装
  5. PHP sprintf() 函数
  6. 【响应式Web前端设计】H5原生表单验证
  7. python【力扣LeetCode算法题库】53- 最大子序和
  8. python【力扣LeetCode算法题库】46- 全排列
  9. 【Deep Learning笔记】用Inception-V3模型进行图像分类
  10. db2联邦数据库 linux,DB2创建联邦数据库