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

// 结果 (按照指定的顺序进行排列了)
 
原文地址:https://www.cnblogs.com/chengyangyang/p/12067448.html