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的形式表現出來如下:
爲了簡單起見,我們可以忽略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: "[email protected]"
,
6:
phone: "6666"
7:
}, // 第一個row結束
8:
ieure: { // 這是ColumnFamily的另一個key
9:
//這是另一個Key對應的column
10:
username: "pengguo"
,
11:
email: "[email protected]"
,
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條數據了。
其中插入數據的各個字段含義如下:
set Keyspace1.Standard1['jsmith']['first'] =
'John'
/ / / / /
/ / /_ key / /_ value
/ / /_ column
/_ keyspace /_ column family
接下來,我們執行查詢操作:
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.
這樣,我們就可以將之前插入的數據查詢出來了。