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.pswp.cn/news/454153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清華大學《操作系統》(八):置換算法

功能&#xff1a;置換算法是指當出現缺頁異常時&#xff0c;需要調入新頁面而內存已滿時&#xff0c;置換算法選擇被置換的物理頁面。 設計目標&#xff1a; 盡可能減少頁面的調入調出次數&#xff1b;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定&#xff1a; 了解具…

python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西&#xff0c;它可以對郵件編碼解碼&#xff0c;用來處理郵件非常好用。處理郵件是一個很細致的工作&#xff0c;尤其是解碼郵件&#xff0c;因為它的格式變化太多了&#xff0c;下面先看看一個郵件的源文件&#xff1a;Received: from …

爛泥:通過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…

gcc交叉編譯的實現

gcc支持多種不同的語言&#xff0c;也支持多種不同的CPU架構。在它的實現上&#xff0c;不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥: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、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵&#xff0c;來自統計學習方法的PCA插圖又要考試了&#xff0c;推導一下方差最大化與均方差最小化&#xff0c;老師上課講了一些均方差最小化&#xff0c;推導的過程很詳細不過自己沒有記下來&#xff0c;復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…

《操作系統》OS學習(十):進程控制

進程切換&#xff08;上下文切換&#xff09;&#xff1a; 定義&#xff1a;暫停當前運行進程&#xff0c;從運行狀態變成其他狀態&#xff0c;調度另一個進程從就緒狀態變成運行狀態要求&#xff1a;切換前&#xff0c;保存進程上下文&#xff1b;切換后&#xff0c;恢復進程…

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則&#xff1a;error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

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提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景&#xff1a;公司的審計日志經常出現不記錄命令的情況&#xff0c;但是又無法監控到審計功能是否正常。所以我們思路是&#xff0c;每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常&#xff0c;則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換&#xff08;上下文切換&#xff09;&#xff1a;切換CPU的當前任務&#xff0c;從一個進程/線程到另一個&#xff0c;保存當前在PCB/TCB中的執行上下文&#xff0c;讀取下一個的上下文 CPU調度&#xff1a;從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…

Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

該方法可以得到遠程主機的域名&#xff0c;也可以得到本機名。getHostName方法的定義如下&#xff1a; publicString getHostName() 下面是三種創建InetAddress對象的方式&#xff0c;在這三種方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿輔導python面試_猿輔導面試經歷—個人感受

今天參加了猿輔導的二面&#xff0c;無數槽點&#xff0c;不知道是不是很多公司都是這樣&#xff0c;但是我還是忍不住要逼逼叨。6月10號&#xff0c;我向猿輔導投了簡歷&#xff0c;想做招聘邀約專員這個崗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份簡歷之后通知我…

對稱加密與非對稱加密

&#xff08;一&#xff09;對稱加密&#xff08;Symmetric Cryptography&#xff09; 對稱加密是最快速、最簡單的一種加密方式&#xff0c;加密&#xff08;encryption&#xff09;與解密&#xff08;decryption&#xff09;用的是同樣的密鑰&#xff08;secret key&#xff…

清華大學《操作系統》(十二):臨界區與鎖

多進程并發運行&#xff0c;導致多個進程間有資源共享&#xff0c;比如CPU、內存&#xff0c;因此存在不確定性和不可重現&#xff0c;可能導致多次運行結果不一致。因此操作系統需要利用同步機制在并發執行的同時&#xff0c;保證一些操作是原子操作。 互斥是指一個進程占用了…