Cassandra的数据类型

Cassandra 的通信契约文件( cassandra.thrift )中定义了 Cassandra 使用的所有数据类型,这些数据类型对应于我们之前讲到的数据模型中的各个 概念,比如 Column ColumnFamily 等。我们将分别根据 Java 编程接口讲解每一种数据类型。

 

3.2.1  Column

Column Cassandra 中是最基本的存储单元,用于存储某一行的信息。

Column cassandra.thrift 中的定义如下:

struct Column {

 1 required binary name,

 2 required binary value,

 3 required i64 timestamp,

}

Column name value 的类型都是 byte ,其中 name 用于存储列的名称, value 用于存储列的值, timestamp 用于存储列被更新的时间,类型为 long

 

3.2.2  SuperColumn

SuperColumn 是在 Super 类型的 ColumnFamily 中存储数据的单元, SuperColumn 中将包含多个 Column

SuperColumn cassandra.thrift 中的定义如下:

struct SuperColumn {

 1 required binary name,

 2 required list<Column> columns,

}

SuperColumn 中, name 用于存储 SuperColumn 的名称,类型为 byte columns 是存储 Column 的数组。

 

3.2.3  ColumnOrSuperColumn

ColumnOrSuperColumn cassandrathrift 中的定义如下:

struct ColumnOrSuperColumn {

 1 optional Column column,

 2 optional SuperColumn super_column,

}

正如名字所描述的那样, ColumnOrSuperColumn 既可以是一个 Column ,也可以是一个 SuperColumn 。它的 column 字段和 super_column 中只能一个有值。

由于 Cassandra 所提供的接口中,返回的值可能是 Column 也可能是 SuperColumn ,所以使用 ColumnOrSuperColumn 的类型,我们只需要判断究竟是哪个字段有值即可。

 

3.2.4  ColumnParent

ColumnParent cassandra.thrift 中的定义如下:

struct ColumnParent {

 3 required string column_family,

 4 optional binary super_column,

}

我们可以将 ColumnParent 理解为文件系统中的一个目录,如果希望查找某一个 key 对应的 value 中, ColumnFamily 所有的值,只要指定 column_family 字段就可以了。如果我们希望查找某一个 SuperColumn 的所有值,我们不仅需要指定 column_family 字 段,还需要指定 super_column 字段。

 

3.2.5  ColumnPath

ColumnPath cassandra.thrift 中的定义如下:

struct ColumnPath {

 3 required string column_family,

 4 optional binary super_column,

 5 optional binary column,

}

我们可以将 ColumnPath 理解为文件系统中的一个具体文件,如果希望查找某一个 key 对应的 value 中某一个 ColumnFamily 的某一个 Column 的值,我们需要指定 column_family 字段和 column 字段。如果我们希望查找某一个 SuperColumn 中某一个 Column 的值,我们不仅需要指定 column_family 字段和 super_column 字段,还需要指定 column 字段。

 

3.2.6  SliceRange

SliceRange cassandra.thrift 中的定义如下:

struct SliceRange {

 1 required binary start,

 2 required binary finish,

 3 required bool reversed=0,

 4 required i32 count=100,

}

当我们查询某一个 Key 下面的 Value 的时候,可以通过 SliceRange 来指定需要返回的 Column 规则。

其中, start 字段代表按照 ColumnFamily 定义的排序规则需要返回的第一个 Column 名称, finish 字段代表按照 ColumnFamily 定义的排序规则需要返回的最后一个 Column 名称, reversed 字段代表返回的 Column 集合的顺序,如果为 false ,则为顺序返回;如果为 true ,则为逆序返回,默认为顺序返回。最后一个字段 count 代表返回的结果中 Column 的最大个数,默认为 100 个,如果实际的 Column 数量小于 count ,则返回实际的 Column 数量。

假设我们希望返回某一个 Key 下面的所有 Column ,那么将 start finish 都设置为 ArrayUtils.EMPTY_BYTE_ARRAY ,将 counter 设置为 Integer.MAX_VALUE 即可。

 

3.2.7  SlicePredicate

SlicePredicate cassandra.thrift 中的定义如下:

struct SlicePredicate {

 1 optional list<binary> column_names,

 2 optional SliceRange slice_range,

}

当我们查询某一个 Key 下面的 Value 的时候,可以通过 SlicePredicate 来指定需要返回哪些 Column

如果希望返回某几个具体的 Column ,那么指定 column_names 字段的值就可以了。如果希望按照某一个规则返回相应的 Column ,那么指定 slice_range 字段就可以了。

 

3.2.8  Deletion

Deletion cassandra.thrift 中的定义如下:

struct Deletion {

 1 required i64 timestamp,

 2 optional binary super_column,

 3 optional SlicePredicate predicate,

}

如果希望在 Cassandra 中删除某一个 Key 中的 Column ,只需要指定 timestamp 字段和 predicate 字段即可。如果希望删除 Key 中的 SuperColumn 下的 Column ,不仅需要指定 timestamp 字段和 predicate 字段,还需要指定需要删除的 super_column 字段。其中,指定的 timestamp 字段为当前的系统时间即可。

 

3.2.9  Mutation

Mutation cassandra.thrift 中的定义如下:

struct Mutation {

 1 optional ColumnOrSuperColumn column_or_supercolumn,

 2 optional Deletion deletion,

}

Cassandra 中,所有的操作分为两种类型:修改和删除。其中,修改又可以分为插入和修改。我们对 Cassandra 中数据的所有修改都使用 Mutation 来操作。如果是插入新的数据,只需要指定 column_or_supercolumn 字段即可,如果是要修改现有的数据,也是直接指定 column_or_supercolumn 字段。删除数据指定 deletion 字段即可。

 

3.2.10  KeyRange

KeyRange cassandra.thrift 中的定义如下:

struct KeyRange {

 1 optional string start_key,

 2 optional string end_key,

 3 optional string start_token,

 4 optional string end_token,

 5 required i32 count=100

}

Cassandra 不仅支持按照某一个规则查询 Key 下面的 Column 的值,还能够通过 KeyRange 指定一个规则去查询一批 Key 的值。

KeyRange 提供两种查询方式:按照 Key 查询,在 start_key end_key 字段中指定起始的 Key 值即可;按照 token 查询,在 start_token end_token 字段中指定其中的 token 值即可。

这里需要注意的是范围:如果指定 start_key=keyX end_key=keyX ,那么返回的只有 Key keyX 的值;如果指定 start_token=tokenY end_token=tokenY ,那么会返回所有的 Key 值。

 

3.2.11  KeySlice

KeySlice cassandra.thrift 中的定义如下:

struct KeySlice {

 1 required string key,

 2 required list<ColumnOrSuperColumn> columns,

}

我们从 Cassandra 查询出来的结果使用 KeySlice 来保存。在 KeySlice 中,字段 key 用来保存返回结果的 Key 值, columns 字段用来保存这个 Key 下面的 column 的信息。

 

3.2.12  TokenRange

TokenRange cassandra.thrift 中的定义如下:

struct TokenRange {

 1 required string start_token,

 2 required string end_token,

 3 required list<string> endpoints,

}

我们可以根据 Token Cassandra 查询数据。

通过 TokenRange ,我们在 start_token end_token 字段指定开始和结尾的 Token ,并通过 endpoints 字段指定需要查询的机器地址即可。

 

3.2.13  AuthenticationRequest

AuthenticationRequest cassandra.thrift 中的定义如下:

struct AuthenticationRequest {

 1 required map<string,string> credentials,

}

AuthenticationRequest 包含了我们录入 Cassandra 的信息,其中 credentials 字段的 key 为用户名, credentials 字段的 value 为用户密码。

 

3.2.14  ConsistencyLevel

ConsistencyLevel cassandra.thrift 中的定义如下:

enum ConsistencyLevel {

 ZERO=0,

 ONE=1,

 QUORUM=2,

 DCQUORUM=3,

 DCQUORUMSYNC=4,

 ALL=5,

 ANY=6,

}

Cassandra 的读取过程中,支持的一致性级别为 ONE QUORUM ALL

假设我们的数据备份级别为 3 ,会有以下三种结果:

1 ) 如果读取级别为 ONE ,那么只要读取到 3 份数据中的 1 份数据就会返回结果。

2 ) 如果读取的级别为 QUORUM ,那么需要读取到 3 份数据中的 2 份数据才会返回结果。

3 ) 如果读取的级别为 ALL ,那么需要读取到所有的 3 份数据才会返回结果。

Cassandra 的写入过程中,支持的一致性级别为 ZERO ANY ONE QUORUM ALL

假设我们的数据备份级别为 3 ,会有以下 5 种结果:

1 ) 如果写入级别为 ZERO ,那么只要 Cassandra 接受到这个写入请求后,就算写入成功, Cassandra 会在后台完成整个写入过程。

2 ) 如果写入级别为 ANY ,只要有任意 1 Cassandra 完成了写入操作(包括 hint 写入),就算写入成功。

3 ) 如果写入级别为 ONE ,只要有 1 台负责该数据的 Cassandra 完成了写入操作,就算写入成功。

4 ) 如果写入级别为 QUORUM ,只要有 2 台负责该数据的 Cassandra 完成了写入操作,就算写入成功。

5 ) 如果写入级别为 ALL ,需要 3 台负责该数据的 Cassandra 都完成了写入操作,才能算写入成功。

 

3.2.15  NotFoundException

NotFoundException cassandra.thrift 中的定义如下:

exception NotFoundException {

}

如果在 Cassandra 中查询的值不存在,将抛出这个异常。

 

3.2.16  InvalidRequestException

InvalidRequestException cassandra.thrift 中的定义如下:

exception InvalidRequestException {

 1 required string why

}

如果我们进行了不可执行的操作,将抛出这个异常。比如,在读取数据的时候,使用的一致性级别为 ConsistencyLevel.ZERO 或者需要查询的数据为 column ,但是使用的查询规则为 superColumn

 

3.2.17  UnavailableException

UnavailableException cassandra.thrift 中的定义如下:

exception UnavailableException {

}

如果 Cassandra 在写入或者读取的过程中,发现需要操作的节点数少于实际存活的节点数,将抛出这个异常。

比如我们 Cassandra 的数据备份级别为 3 ,选择的读取级别为 QUORUM ,那么要是实际包含这 3 份数据的机器中,只有一台在提供服务,其他两台机器无法提供服务,就会抛出 UnavailableException 的异常。

 

3.2.18  TimedOutException

TimedOutException cassandra.thrift 中的定义如下:

exception TimedOutException{

}

如果 Cassandra 在写入或者读取的过程中,执行时间超过了 RPC 的时间限制(默认为 30 秒钟),那么将抛出这个异常。

 

3.2.19  AuthenticationException

AuthenticationException cassandra.thrift 中的定义如下:

exception AuthenticationException {

 1 required string why

}

如果在登入 Cassandra 的过程中,用户名或者密码错误,将抛出这个异常。

 

3.2.20  AuthorizationException

AuthorizationException cassandra.thrift 中的定义如下:

exception AuthorizationException {

 1 required string why

} 如果在登入 Cassandra 的过程中,指定的 Keyspace 不存在,将抛出这个异常。



本文节选自《Cassandra 实战》,作者:郭鹏

关于本书,敬请访问:http://product.china-pub.com/198207 或者http://product.dangdang.com/product.aspx?product_id=21087103

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值