Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
Cassandra 的数据存储结构
Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。
图 1. Cassandra 的数据模型图:
- Cassandra 的数据模型的基本概念:
- Cluster : Cassandra 的节点实例,它可以包含多个 Keyspace
- Keyspace : 用于存放 ColumnFamily 的容器,相当于关系数据库中的 Schema 或 database——类似mongodb里的namespace use xxx;
- ColumnFamily : 用于存放 Column 的容器,类似关系数据库中的 table 的概念
- SuperColumn :它是一个特列殊的 Column, 它的 Value 值可以包函多个 Column
- 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识别成为不同的类型,以此来达到灵活排序的目的。
Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>的更多相关文章
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- kafka 数据存储结构+原理+基本操作命令
数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...
- Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析
Hashtable 是一个很常见的数据结构类型,前段时间阿里的面试官说只要搞懂了HashTable,hashMap,HashSet,treeMap,treeSet这几个数据结构,阿里的数据结构面试没问 ...
- HBase介绍(2)---数据存储结构
在本文中的HBase术语:基于列:column-oriented行:row列组:column families列:column单元:cell 理解HBase(一个开源的Google的BigTable实 ...
- Redis之数据存储结构
今天去中关村软件园面试,被问到:你做项目用到的Redis处理数据用的什么结构?顿时石化,”用到的结构,不就是key-value嘛,还有什么结构?“.面试官说:“平时除了工作,要加强学习,下面的面试我觉 ...
- 0809MySQL实战系列:大字段如何优化|数据存储结构
转自https://yq.aliyun.com/articles/59256?spm=5176.100239.blogcont59257.9.5MLR2d 摘要: 背景 线上发现一张表,1亿的数据量, ...
- mysql之innodb存储引擎---数据存储结构
一.背景 1.1文件组织架构 首先看一下mysql数据系统涉及到的文件组织架构,如下图所示: msyql文件组织架构图 从图看出: 1.日志文件:slow.log(慢日志),error.log(错误日 ...
- mysql的innodb数据存储结构
数据库磁盘读取与系统磁盘读取 1,系统从磁盘中读取数据到内存时是以磁盘块(block)为基本单位,位于同一个磁盘块中的数据会被一次性读取出来. 2,innodb存储引擎中有页(Page)的概念,页 ...
- HBase 数据存储结构
在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...
随机推荐
- 笔记-django学习链接
form表单学习 https://www.cnblogs.com/weiman3389/p/6225075.html python字符串replace()方法 https://www.cnblogs. ...
- Hazelcast 内存数据网格
Hazelcast ( www.hazelcast.com)是一种内存数据网格 in-memory data grid,提供Java程序员关键任务交易和万亿级内存应用. Hazelcast的集群属于“ ...
- Python3 标准库
Python3标准库 更详尽:http://blog.csdn.net/jurbo/article/details/52334345 文本 string:通用字符串操作 re:正则表达式操作 diff ...
- Redis的慢查询日志
编辑配置文件/etc/redis.conf针对慢查询日志,可以设置两个参数,一个是执行时长,单位是毫秒,另一个是慢查询日志的长度.当一个新的命令被写入日志是,最老的一条会从命令日志队列中被移除slow ...
- 4 TensorFlow入门之dropout解决overfitting问题
------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...
- C#实现对图片文件的压缩、裁剪操作实例
本文实例讲述了C#对图片文件的压缩.裁剪操作方法,在C#项目开发中非常有实用价值.分享给大家供大家参考.具体如下: 一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便 ...
- 移动app自动化测试
原文出处https://www.toutiao.com/i6473606106970063374/ 原文作者是今日头条的:一个字头的诞生 在此感谢原文作者的无私分享! 移动App自动化测试(一) 目前 ...
- Java消息队列ActiveMQ (一)--JMS基本概念
摘要:The Java Message Service (JMS) API is a messaging standard that allows application components bas ...
- 【Head First Servlets and JSP】笔记1
1.把Java放到HTML中,JSP应运而生. 2.Servlet本身并没有main()方法,所以必须要有其他Java程序去调用它,这个Java程序就是Web容器(Container).Tomcat就 ...
- 验证码插件代码:image.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...