大话Cassandra数据模型

深信服aCloud虚拟存储VS3.0实战:从数据分片到仲裁机制的全流程解析 本文深度解析了深信服aCloud虚拟存储VS3.0的核心架构与生产级实践。从数据分片、条带化写入、多副本机制到智能缓存分层,详细阐述了其如何实现高性能与高可靠性的平衡。同时,深入剖析了动态均衡、平滑扩容以及故障恢复与仲裁机制,为运维人员和技术决策者提供了在超融合基础架构(HCI)中部署和管理虚拟存储的实战指南。 阅读详情

Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。

Cassandra的特点如下:

1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。

2.支持range查询:可以对Key进行范围查询。

3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。

我们可以将Cassandra的数据模型想象成一个四维或者五维的Hash。

Column

Column是Cassandra中最小的数据单元。它是一个3元的数据类型,包含:name,value和timestamp。

将一个Column用JSON的形式表现出来如下:

   1: {  // 这是一个column
   2:     name: "逖靖寒的世界",
   3:     value: "gpcuster@gmali.com",
   4:     timestamp: 123456789
   5: } 

为了简单起见,我们可以忽略timestamp。就把column想象成一个name/value即可。

注意,这里提到的name和value都是byte[]类型的,长度不限。

SuperColumn

我们可以将SuperColumn想象成Column的数组,它包含一个name,以及一系列相应的Column。

将一个SuperColumn用JSON的形式表现如下:

   1: {   // 这是一个SuperColumn
   2:     name: "逖靖寒的世界",
   3:     // 包含一系列的Columns
   4:     value: {
   5:         street: {name: "street", value: "1234 x street", timestamp: 123456789},
   6:         city: {name: "city", value: "san francisco", timestamp: 123456789},
   7:         zip: {name: "zip", value: "94107", timestamp: 123456789},
   8:     }
   9: }

 

Columns和SuperColumns都是name与value的组合。最大的不同在于Column的value是一个“string”,而SuperColumn的value是Columns的Map。

还有一点需要注意的是:SuperColumn’本身是不包含timestamp的。

ColumnFamily

ColumnFamily是一个包含了许多Row的结构,你可以将它想象成RDBMS中的Table。

每一个Row都包含有client提供的Key以及和该Key关联的一系列Column。

我们可以看看结构:

   1: UserProfile = { // 这是一个ColumnFamily
   2:     phatduckk: {   // 这是对应ColumnFamily的key
   3:         // 这是Key下对应的Column
   4:         username: "gpcuster",
   5:         email: "gpcuster@gmail.com",
   6:         phone: "6666"
   7:     }, // 第一个row结束
   8:     ieure: {   // 这是ColumnFamily的另一个key
   9:         //这是另一个Key对应的column
  10:         username: "pengguo",
  11:         email: "pengguo@live.com",
  12:         phone: "888"
  13:         age: "66"
  14:     },
  15: }

ColumnFamily的类型可以为Standard,也可以是Super类型。

我们刚刚看到的那个例子是一个Standard类型的ColumnFamily。Standard类型的ColumnFamily包含了一系列的Columns(不是SuperColumn)。

Super类型的ColumnFamily包含了一系列的SuperColumn,但是并不能像SuperColumn那样包含一系列Standard ColumnFamily。

这是一个简单的例子:

   1: AddressBook = { // 这是一个Super类型的ColumnFamily
   2:     phatduckk: {    // key
   3:         friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"}, 
   4:         John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
   5:         Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
   6:         Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
   7:         Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
   8:         ...
   9:     }, // row结束
  10:     ieure: {     // key
  11:         joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
  12:         William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  13:     },
  14: }

Keyspace

Keyspace是我们的数据最外层,你所有的ColumnFamily都属于某一个Keyspace。一般来说,我们的一个程序应用只会有一个Keyspace。

简单测试

我们将Cassandra运行起来以后,启动命令行,执行如下操作:

cassandra> set Keyspace1.Standard1['jsmith']['first'] = 'John' 
Value inserted. 
cassandra> set Keyspace1.Standard1['jsmith']['last'] = 'Smith' 
Value inserted. 
cassandra> set Keyspace1.Standard1['jsmith']['age'] = '42' 
Value inserted.

这个时候,Cassandra中就已经有3条数据了。

其中插入数据的各个字段含义如下:

image

接下来,我们执行查询操作:

cassandra> get Keyspace1.Standard1['jsmith'] 
  (column=age, value=42; timestamp=1249930062801) 
  (column=first, value=John; timestamp=1249930053103) 
  (column=last, value=Smith; timestamp=1249930058345) 
Returned 3 rows.

这样,我们就可以将之前插入的数据查询出来了。

排序

有一点需要明确,我们使用Cassandra的时候,数据在写入的时候就已经排好顺序了。

在某一个Key内的所有Column都是按照它的Name来排序的。我们可以在storage-conf.xml文件中指定排序的类型。

目前Cassandra提供的排序类型有:BytesType, UTF8Type,LexicalUUIDType, TimeUUIDType, AsciiType,和LongType。

现在假设你的原始数据如下:

{name: 123, value: "hello there"}, 
{name: 832416, value: "kjjkbcjkcbbd"}, 
{name: 3, value: "101010101010"}, 
{name: 976, value: "kjjkbcjkcbbd"}

当我们storage-conf.xml文件中指定排序的类型为LongType时:


      ColumnFamily 在 storage-conf.xml 中定义 
--> 
CompareWith="LongType" Name="CF_NAME_HERE"/>

排序后的数据就是这样的:

{name: 3, value: "101010101010"},   
{name: 123, value: "hello there"}, 
{name: 976, value: "kjjkbcjkcbbd"}, 
{name: 832416, value: "kjjkbcjkcbbd"}

如果我们指定排序的类型为UTF8Type


      ColumnFamily 在 storage-conf.xml 中定义

--> 
CompareWith="UTF8Type" Name="CF_NAME_HERE"/>

排序后的数据就是这样的:

{name: 123, value: "hello there"},    
{name: 3, value: "101010101010"}, 
{name: 832416, value: "kjjkbcjkcbbd"}, 
{name: 976, value: "kjjkbcjkcbbd"}

大家可以看到,指定的排序类型不一样,排序的结果也是完全不同的。

对于SuperColumn,我们有一个额外的排序维度,所以我们可以指定CompareSubcolumnsWith来进行另一个维度的排序类型。

假设我们的原始数据如下:

{ // first SuperColumn from a Row 
    name: "workAddress", 
    // and the columns within it 
    value: { 
        street: {name: "street", value: "1234 x street"}, 
        city: {name: "city", value: "san francisco"}, 
        zip: {name: "zip", value: "94107"} 
    } 
}, 
{ // another SuperColumn from same Row 
    name: "homeAddress", 
    // and the columns within it 
    value: { 
        street: {name: "street", value: "1234 x street"}, 
        city: {name: "city", value: "san francisco"}, 
        zip: {name: "zip", value: "94107"} 
    } 
}

然后我们定义CompareSubcolumnsWith和CompareWith的排序类型都是UTF8Type,那么排序后的结果为:

{ 
    // this one's first b/c when treated as UTF8 strings 
    { // another SuperColumn from same Row 
        // This Row comes first b/c "homeAddress" is before "workAddress"            
        name: "homeAddress", 
        // the columns within this SC are also sorted by their names too 
        value: { 
            // see, these are sorted by Column name too 
            city: {name: "city", value: "san francisco"},                
            street: {name: "street", value: "1234 x street"}, 
            zip: {name: "zip", value: "94107"} 
        } 
    },        
    name: "workAddress", 
    value: { 
        // the columns within this SC are also sorted by their names too 
        city: {name: "city", value: "san francisco"},            
        street: {name: "street", value: "1234 x street"}, 
        zip: {name: "zip", value: "94107"} 
    } 
}

再额外提一句,Cassandra的排序功能是允许我们自己实现的,只要你继承org.apache.cassandra.db.marshal.IType就可以了。

参考文档

WTF is a SuperColumn? An Intro to the Cassandra Data Model

DataModel

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)     一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavr... 阅读详情

相关推荐

ESP32S3电池电量监测实战:从分压电路到IDF组件配置(附GitHub源码)

本文详细介绍了ESP32S3电池电量监测的完整实战方案。从硬件分压电路的电阻选型、滤波设计,到软件层面利用ESP-IDF的ADC校准机制提升精度,并重点讲解了如何集成bat_monitor开源组件快速实现电压采集、电量计算、充电检测与事件通知。文章提供了从原理到调试的完整指南和GitHub源码,帮助开发者构建稳定可靠的物联网设备电源管理系统。

ee345的博客 529

大话CASSANDRA数据模型

大话CASSANDRA数据模型 Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。 Cassandra的特点如下: 1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。 2.支持range查询:可以对Key进行范围查询。 3.高可用,可扩展:单点故障不影

varyall的专栏 266

半导体AMHS天车振动控制:从0.5G到超低振动的技术演进与工程实战

在先进晶圆厂中,自动化物料搬运系统(AMHS)的天车如同空中出租车,承担着晶圆盒(FOUP)在洁净室各工艺区间的转运任务。然而,当天车加减速、过弯或抓取时产生的机械振动通过轨道梁和建筑结构传递至光刻机等敏感设备,便可能直接威胁套刻精度与良率。传统被动减振方案依靠橡胶垫和弹簧,在0.5G指标时代曾行之有效,但在EUV光刻和先进制程面前已力不从心。主动振动控制技术通过传感器、控制器与作动器构成的闭环系统,在轨道吊点和机械手端实时输出反向力抵消振动,配合磁悬浮走行、轻量化结构及调度系统的路径优化,将振动从0.5G

weixin_29188043的博客 341

Cassandra杂记10-大话Cassandra数据模型

Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。 Cassandra的特点如下: 1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。 2.支持range查询:可以对Key进行范围查询。 3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。 我们可

Jason的专栏 254

[FreeRTOS+STM32CubeMX] 03 USART串口调试-基于中断实现接收和发送数据

我们接着上一小节,上一节讲到,接收上位机传来的数据时,需要事先知道传来的数据的字节数,这一操作实在有些反人类,那么如何解决这个问题,上位机输入多少,我们就接收多少数据呢? 接下来我将把USART引入中断,在接收数据的回调函数中引入二值信号量、消息队列,来让我的接收数据能够存储在队列中,并一个一个的在任务中输出出来,并最终在上位机回显。

RichieHuang的博客 2648

中孚保密检查系统彻底卸载指南:绕过口令与清除内核残留

中孚保密检查系统是深度集成于Windows内核的合规管控软件,其卸载涉及用户态口令校验、内核态服务引擎与Ring 0级驱动自保三重机制。理解其基于SHA-256哈希的本地口令验证原理和zfsysflt.sys过滤驱动的加载逻辑,是实现无残留清理的技术前提。该系统具备高权限驻留特性,常规卸载工具无法触达驱动与服务层,易引发蓝屏、启动缓慢及新安全软件冲突等工程问题。典型应用场景包括涉密终端批量清退、安全研究环境重建及误装后紧急退出。本文聚焦‘口令绕过+手动清理’双轨方案,覆盖注册表、服务、驱动、文件与计划任务五

weixin_33508411的博客 947

Cassandra 入门(资料收集)

官方网站:http://cassandra.apache.org/download/NOSQL debrief上的视相关资料:http://blog.oskarsson.nu/2009/06/nosql-debrief.htmlCassandra PPT: http://static.last.fm/johan/nosql-20090611/cassandra_nosql.pptCassand...

weixin_34256074的博客 1075

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

谈谈Cassandra的客户端

最近试用了一段时间Cassandra,将Oracle中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用Cassandra API进行交互了。Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:Thrif

4194

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 544

S32K344开发环境搭建全攻略:S32DS 3.5.12与RTD 3.0.0实战指南

在嵌入式开发中,集成开发环境(IDE)与实时驱动(RTD)的协同配置是项目启动的关键。S32DS作为NXP官方IDE,结合RTD包,为S32K3系列提供底层驱动支持。正确安装与路径配置能确保编译、调试与烧录流程顺畅,避免常见错误。该环境适用于汽车电子、工业控制等场景,如车身域控、BMS。本文基于S32K344芯片,详细记录从软件下载到调试的完整过程,帮助开发者快速搭建稳定开发环境。

weixin_42713608的博客 210

反转Cassandra索引

问题 通过前面的文章:《谈谈Cassandra的客户端》和《大话Cassandra数据模型》我们已经了解了Cassandra的数据模型和编程接口的情况。 假如我们在实际的应用中我们的数据是这样保存的: 每一个key对应了一些列的Column:port,Version,Service,Status等等。 通过某一个key,我们能够找到和这个key相关的所有Column的值。

913

X-AnyLabeling-main标注YOLO关键点POSE

同一物体的框和点的 群组编号 要相同。代表这些点和方框是同一物体上的。标注方框之后记得把后面的。顺序要和你标注的顺序一致。写入1,而且之后的点的。配置导出文件.yaml。

qq_53545309的博客 2102

Cassandra杂记14-谈谈Cassandra的客户端

最近试用了一段时间Cassandra,将Oracle中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用Cassandra API进行交互了。 Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。 对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:Thrif

Jason的专栏 824

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

整合Cassandra与Hadoop MapReduce

<br />看到这个标题,大家一定会问了。这个整合如何定义?<br />我个人认为,所谓的整合是指:我们可以编写MapReduce程序,从HDFS中读取数据然后插入到Cassandra中。也可以是直接从Cassandra中读取数据,然后进行相应的计算。从HDFS中读取数据然后插入到Cassandra中<br />对于这种类型,我们可以按照以下几个步骤来操作。<br />1 将需要插入Cassandra的数据上传到HDFS中。<br />2 启动MapReduce程序。<br />这种类型的整合其实和Cass

3208

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Cassandra介绍

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富.Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模...

xiajingsong的博客 256

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Cassandra的客户端

最近试用了一段时间Cassandra,将Oracle中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用Cassandra API进行交互了。Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:Thrif

448

基于Cassandra搭建简单Blog程序后台

在上一篇博客《大话Cassandra数据模型》中,我们讲解了Cassandra的数据模型。在这篇博客中,我们将基于Cassandra搭建一个简单的Blog程序后台。 需求 Blog程序的需求如下: 1 允许不同的用户写Blog。 2 Blog内容包括:标题,内容,ID,发布日期。 3 每一篇Blog可以打上任意多个Tag。 4 人们可以在Blog上留言,内容包括:留言内

1888
上一篇: Redis配置文件redis.conf参数解读
下一篇: 分布式 Key-Value 存储系统:Cassandra 入门
Java2King
博客等级 码龄18年 221粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值