Cassandra最佳實踐

2021-10-06 13:28:23 字數 2254 閱讀 1090

##巢狀的排序過的map結構

cassandra的column families ==>map[rowkey,sortedmap[column_name,value]]==>key 排序過

資料模型的建立根據查詢業務來

cql的schema定義的列名相當於乙個主體,主體的值才算列名

create table events (

key text,

column1 int,

column2 int,

value text,

primary key(key, column1, column2)

) with compact storage

key的值才是cassandra的列名,所以說列是動態增加,但是主體key必須是固定的,

###更複雜的例子

乙個更複雜一點的例子:

create table example ( partitionkey1 text, partitionkey2 text, clusterkey1 text, clusterkey2 text, normalfield1 text, normalfield2 text, primary key ( (partitionkey1, partitionkey2), clusterkey1, clusterkey2 ) );

這裡我們用字段在內部儲存時的型別來命名字段。而且我們已經包含了所有情形。這裡的主鍵不僅僅是復合主鍵,而且是復合partition key (在primary key部分的前半段,用括號括起的部分)和復合cluster key。

然後插入一些行:

insert into example ( partitionkey1, partitionkey2, clusterkey1, clusterkey2, normalfield1, normalfield2 ) values ( 'partitionval1', 'partitionval2', 'clusterval1', 'clusterval2', 'normalval1', 'normalval2');

資料怎麼儲存呢?

rowkey: partitionval1:partitionval2 => (column=clusterval1:clusterval2:, value=, timestamp=1374630892473000) => (column=clusterval1:clusterval2:normalfield1, value=6e6f726d616c56616c31, timestamp=1374630892473000) => (column=clusterval1:clusterval2:normalfield2, value=6e6f726d616c56616c32, timestamp=1374630892473000)

注意partitionval1和partitionval2,我們可以發現rowkey(也稱為partition key)是這兩個字段值的組合

clusterval1和clusterval2這兩個cluster key的 值(注意是值不是欄位名稱)的組合,成為了每乙個非主鍵列名的字首

非主鍵列的值,比如normalfield1和normalfield2的值,是列名加上cluster key的值之後的列的值

每乙個row中的列,是按列名排序的,而因為cluster key的值成為非主鍵列名的字首,每個row下的所有的列,實際上首先按照cluster key的值排序,然後再按照cql裡的列名排序

##模型設計

集群負載均衡最終依靠rowkey選擇;相反地,rowkey也決定row的長度。所以在設計模型的時候要謹記負載均衡。

因為row不會跨節點分割,所以單個row必須適應節點磁碟大小

一種減輕問題的方式是新增一些資訊到rowkey——事件型別、機器id,或者適應你用例的類似值。

確保column key和row key是唯一的

cassandra所有操作都是upsert(不存在插入,存在則更新)操作。

保持column name簡短--key的值

對某個row key的一次mutation操作是原子的。所以當你需要事務性的時候,嘗試設計你的模型,讓它一次永遠只更新一行。

在cassandra中,ttl(存活時間)不是設定在column family上,它設定於每個column value,一旦設定後就很難改變。或者說,如果建立column時候沒有設定,那之後就很難對其設定ttl。

composite columns 優於 super columns

最佳實踐 Flutter 最佳實踐

最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...

JUnit最佳實踐

junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...

SVN最佳實踐

楊爭 subversion是新一代的版本控制工具,由於其優於cvs的一些特點,得到了越來越多人的關注和使用,本人根據自己使用svn的經驗,寫了這篇文章,希望對大家有所幫助,其中有些實踐並不是僅僅適用於svn,對其他版本控制工具也是適用的。1 養成良好的記錄日誌的習慣.svn ci提交,最好在日誌中記...