一、下載
windows 下載 https://cassandra.apache.org/ 建議下載版本 3.11.3 使用最新版 3.115 發現啟動不起來 必須要安裝Java8
客戶端工具使用: NoSQL Manager for Cassandra
二、介紹
Apache Cassandra 是高度可擴展的,高性能的分布式 nosql。
特點:
- 面向列的數據庫
- 具有擴展性 線性可擴展性
- 容錯性 能夠輕易部署集群
- 靈活的數據存儲
- 支持事務
- 快速寫入,而不影響讀取效率
- 具有數據自動過期的功能
- Cassandra不支持JOINS,GROUP BY,OR子句,聚合等等。 可以用集合表示關系
- 在數據寫入的時候,就可以指定排序問題
主要組成部分:
- 節點 存儲數據的地方
- 數據中心 相關節點的集合
- 集群 包含一個或者多個數據中心
- 提交日志 可以進行崩潰恢復機制
- 存儲表 提交日志后,數據被寫入到內存中
- SSTable 當內容達到閾值時,將內容刷新到磁盤上
- 布魯姆過濾器 快速查詢的方法
應用場景:
- 移動和消息服務的首選
- 高速處理數據
數據類型:
CQL | 常量 | 描述 |
asci | String | 字符串 |
bigint | Integer | long |
blob | blobs | |
boolean | Booleans | |
counter | Integers | |
decimal | Integers, Floats | |
double | ||
float | ||
frozen | 元組 集合 | |
inet | 字符串 ip | |
int | 32 int | |
list | 集合 | |
ma | json 風格 | |
set | 元素的集合 | |
tex | utf-8 編碼 string | |
timestamp | 生成日期 | |
timeuuid | 時間格式 uuid | |
uuid | 標准的uuid | |
varchar | utf-8 編碼 | |
varint | 任意精度整數 |
三、 CQL 語法
關系型數據庫 | cassandra |
database | keyspace |
table | cf(column family) |
Primary Key | Primary Key |
Column Name | Key / Column Name |
Column Value | Column Value |
1)和sql 一樣的寫法
package com.sxmd.content; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import java.util.Map; /** * Description: springboot 測試 * * @author cy * @date 2019年12月19日 15:50 * Version 1.0 */ @RunWith(SpringRunner.class) @SpringBootTest public class Main { @Autowired private CassandraTemplate cassandraTemplate; @Test public void mytestInsert(){ // 如果存在 就進行更新 String cql = "insert into my_test(id,name,age,des) values('1','你好1',341,'測試1')"; boolean result = cassandraTemplate.getCqlOperations().execute(cql); Assert.assertTrue(result); } @Test public void mytestUpdate(){ String cql = "update my_test set age = null where id = '1'"; boolean result = cassandraTemplate.getCqlOperations().execute(cql); Assert.assertTrue(result); } @Test public void mytestDelete(){ String cql = "delete from my_test where id = '1'"; boolean result = cassandraTemplate.getCqlOperations().execute(cql); Assert.assertTrue(result); } @Test public void mytestSelect(){ String cql = "select * from my_test where id = '1'"; List<Map<String, Object>> result = cassandraTemplate.getCqlOperations().queryForList(cql); Assert.assertNotNull(result); } }
2)和sql 不同之處
- 主鍵組成 primary key(a) a 分區標識
- 主鍵組成 primary key (a,b,c) a 分區標識 b,c 聚簇列 (默認排序是按照聚簇列進行排序的)
- 主鍵組成 primary key((a,b)c) a,b 是分區標識 c 聚簇列
- static 如果是同一分區,共享此列,如果分區相同,即使分為不同的行,static 必然相同。
3)驗證示例
基本的table
CREATE TABLE my_test ( id text, age int, des text, name text, PRIMARY KEY (id) ) WITH comment='' AND read_repair_chance=0 AND dclocal_read_repair_chance=0.1 AND gc_grace_seconds=864000 AND bloom_filter_fp_chance=0.01 AND compaction={ 'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold':'32', 'min_threshold':'4' } AND compression={ 'chunk_length_in_kb':'64', 'class':'org.apache.cassandra.io.compress.LZ4Compressor' } AND caching={ 'keys':'ALL', 'rows_per_partition':'NONE' } AND default_time_to_live=0 AND id='fd1d1a30-2237-11ea-b646-5b9cd092b4e2' AND min_index_interval=128 AND max_index_interval=2048 AND memtable_flush_period_in_ms=0 AND speculative_retry='99PERCENTILE';
驗證static,創建一個 status 列,表示用戶狀態,為了方便起見,我們要將主鍵修改為復合主鍵。 主鍵為 (id name) , 發現不能在原有的基礎上這樣修改,我們刪除原先的表進行修改,如果使用原cql,id 改下
@Test public void mytestInsert(){ // 如果存在 就進行更新 String cql = "insert into my_test(id,name,age,des,status) values('1','曹操',23,'寧教我負天下人','曹阿蠻')"; String cql1 = "insert into my_test(id,name,age,des,status) values('1','曹孟德',23,'勿叫天下人負我','曹阿瞞')"; boolean result = cassandraTemplate.getCqlOperations().execute(cql); boolean result1 = cassandraTemplate.getCqlOperations().execute(cql1); Assert.assertTrue(result); }
// 執行結果 (此例就說明了 static 的用法)
驗證下排序問題 (在主鍵中加入 age (id,age,name))
@Test public void mytestInsert(){ // 如果存在 就進行更新 String cql = "insert into my_test(id,name,age,des,status) values('1','曹操',23,'寧教我負天下人1','曹阿蠻')"; String cql1 = "insert into my_test(id,name,age,des,status) values('1','曹操',1,'勿叫天下人負我2','曹阿瞞')"; String cql2 = "insert into my_test(id,name,age,des,status) values('1','曹操',57,'勿叫天下人負我3','曹阿瞞')"; String cql3 = "insert into my_test(id,name,age,des,status) values('1','曹操',11,'勿叫天下人負我4','曹阿瞞')"; String cql4 = "insert into my_test(id,name,age,des,status) values('1','曹操',16,'勿叫天下人負我5','曹阿瞞')"; boolean result = cassandraTemplate.getCqlOperations().execute(cql); boolean result1 = cassandraTemplate.getCqlOperations().execute(cql1); boolean result2 = cassandraTemplate.getCqlOperations().execute(cql2); boolean result3 = cassandraTemplate.getCqlOperations().execute(cql3); boolean result4 = cassandraTemplate.getCqlOperations().execute(cql4); Assert.assertTrue(result); }
// 結果 (按照指定的順序進行排列了)