cassandra 入門教程


一、下載

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
這里只演示,最簡單的crud,其他的能夠用客戶端工具搞定 (為了更清楚,我們就結合springboot 項目進行開發,這里使用的)
 

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);
    }

// 結果 (按照指定的順序進行排列了)

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM