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

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. 数据模型实例分析

图 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):

09125500_v5Xx

使用JSON描述的列结构:

{"name": "email", "value: "me@example.com", "timestamp": 1274654183103300 }

超级列(Super Column)的结构:

09125501_4lo3

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















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6278657.html,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华大学《操作系统》(八):置换算法

功能&#xff1a;置换算法是指当出现缺页异常时&#xff0c;需要调入新页面而内存已满时&#xff0c;置换算法选择被置换的物理页面。 设计目标&#xff1a; 尽可能减少页面的调入调出次数&#xff1b;把未来不再访问或短期内不访问的页面调出。 页面锁定&#xff1a; 了解具…

烂泥:通过vsphere给esxi添加本地硬盘

公司ESXi服务器的硬盘空间不够使用&#xff0c;现在新加了一块硬盘在ESxi服务器上。在服务器上添加完硬盘后&#xff0c;在Vsphere上是看不到新加硬盘的。 下面我们来通过虚拟机模拟该情况&#xff0c;先添加一块硬盘。如下图&#xff1a; 在Esxi添加完硬盘后&#xff0c;现在通…

清华大学《操作系统》(九):进程和线程

进程 定义&#xff1a; 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。 组成&#xff1a; 代码数据状态寄存器&#xff08;正在运行的一个程序的所有状态信息&#xff09;&#xff1a;CPU状态CP0、指令指针IP通用寄存器&#xff1a;AX、BX、CX…

开始Flask项目

1.新建Flask项目。2.设置调试模式。3.理解Flask项目主程序。4.使用装饰器&#xff0c;设置路径与函数之间的关系。5.使用Flask中render_template&#xff0c;用不同的路径&#xff0c;返回首页、登录员、注册页。6.用视图函数反转得到URL&#xff0c;{{url_for(‘login’)}}&am…

烂泥:mysql数据库使用的基本命令

1、连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot -p123456 也可写成&#xff1a; mysql -h 192.168.1.214 -u root -p 123456 1.2连接本地数据库 mysql -uroot -p123456 也可写成&#xff1a; mysql -u root -p 123456 2、…

《操作系统》OS学习(十):进程控制

进程切换&#xff08;上下文切换&#xff09;&#xff1a; 定义&#xff1a;暂停当前运行进程&#xff0c;从运行状态变成其他状态&#xff0c;调度另一个进程从就绪状态变成运行状态要求&#xff1a;切换前&#xff0c;保存进程上下文&#xff1b;切换后&#xff0c;恢复进程…

GCC 命令选项使用详解

GCC 命令行详解[转帖] 1、gcc包含的c/c编译器 gcc、cc、c、g gcc和cc是一样的&#xff0c;c和g是一样的&#xff0c;一般c程序就用gcc编译&#xff0c;c程序就用g编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为t…

mvn 打包_Spark源码打包编译的过程

前言上篇文章介绍了下 安装sbt环境 启动scala项目安装SBT环境运行Scala项目为什么要弄这个 因为我本来是想对spark源码编译部署spark是用scala语言编译的spark源码https://gitee.com/pingfanrenbiji/sparkspark提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

清华大学《操作系统》(十一):处理机调度

一、处理机调度概念 进程切换&#xff08;上下文切换&#xff09;&#xff1a;切换CPU的当前任务&#xff0c;从一个进程/线程到另一个&#xff0c;保存当前在PCB/TCB中的执行上下文&#xff0c;读取下一个的上下文 CPU调度&#xff1a;从就绪队列中挑选一个进程/线程作为CPU…

对称加密与非对称加密

&#xff08;一&#xff09;对称加密&#xff08;Symmetric Cryptography&#xff09; 对称加密是最快速、最简单的一种加密方式&#xff0c;加密&#xff08;encryption&#xff09;与解密&#xff08;decryption&#xff09;用的是同样的密钥&#xff08;secret key&#xff…

清华大学《操作系统》(十二):临界区与锁

多进程并发运行&#xff0c;导致多个进程间有资源共享&#xff0c;比如CPU、内存&#xff0c;因此存在不确定性和不可重现&#xff0c;可能导致多次运行结果不一致。因此操作系统需要利用同步机制在并发执行的同时&#xff0c;保证一些操作是原子操作。 互斥是指一个进程占用了…

清华大学《操作系统》(十八):管程于信号量

信号量与管程也是进程间通信的方式。信号量是与锁在同一层级实现的&#xff0c;是操作系统提供的一种协调共享资源访问的方法。信号量由操作系统管理&#xff0c;操作系统作为管理者地位是高于进程的。 一、信号量 1、信号量&#xff08;semaphore&#xff09;&#xff1a;是操…

Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址

今天发现Qmail邮件系统的maillog里面有大量的“user not found”信息&#xff0c;通过下面的日志不难发现&#xff0c;是来自同一IP的很多不同的用户连接Qmail邮件系统认证失败的信息。黑客试图通过这种方式来破解Qmail邮件系统的用户名和密码&#xff0c;从而来发送大量的垃圾…

安装Postman

在web和移动端开发时&#xff0c;常常会调用服务器端的restful接口进行数据请求&#xff0c;为了调试&#xff0c;一般会先用工具进行测试&#xff0c;通过测试后才开始在开发中使用。 这里介绍一下如何在chrome浏览器利用postman应用进行restful api接口请求测试。 因为&#…

清华大学《操作系统》(二十):死锁和进程通信

一、死锁 死锁&#xff1a;一组阻塞的进程&#xff08;两个或多个&#xff09;&#xff0c;持有一种资源&#xff0c;等待获取另一个进程所占有的资源&#xff0c;而导致谁都无法执行。 可重复使用的资源&#xff1a; 在一个时间只能一个进程使用&#xff0c;且不能被删除。…

清华大学《操作系统》(二十二):文件系统

文件系统和文件&#xff1a; 文件系统是操作系统中管理持久性数据的子系统&#xff0c;提供数据存储和访问功能&#xff0c;组织、检索、读写访问数据。文件是具有符号名&#xff0c;由字节序列构成的数据项集合&#xff0c;是文件系统的基本数据单位&#xff0c;文件名是文件…

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

清华大学《操作系统》(二十三):I/O子系统

常见设备接口类型&#xff1a; 1、字符设备&#xff1a;键盘鼠标、串口 a.以字节为单位顺序访问 b.I/O命令通常使用文件访问接口和语义 2、块设备&#xff1a;磁盘、磁带、光驱 a.均匀的数据块访问 b.I/O命令通常使用文件系统接口&#xff0c;也可以使用内存映射访问 3、网络…

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK&#xff1f; 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口&#xff0c;您能够通过该套接口实现主要的地图功能&#xff0c;而且能够定制地图样式&#xff0c;实现个性化地图。 该接口提供下面功能&#xff…

mysql读写分离_MySQL基于amoeba读写分离实验

主从复制只是一个同步数据的方式读写分离&#xff1a;只在主的上面写&#xff0c;只在从的上面读读写分离方案&#xff1a;【1】基于程序代码内部 (生产环境中应用最广泛&#xff0c;性能最好&#xff0c;需要开发人员来实现)【2】基于中间代理层的实现amoeda 是阿里巴巴使用的…