zoukankan      html  css  js  c++  java
  • 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);
        }

    // 结果 (按照指定的顺序进行排列了)
     
  • 相关阅读:
    ios开发-2015-08-07
    ios开发-2015-08-06
    ios开发-2015-08-04
    ios开发-2015-08-03
    ios开发-2015-08-02
    Selenium学习笔记之013:控制滚动条到底部 分类: Selenium 2015-07-23 00:26 19人阅读 评论(0) 收藏
    Selenium学习笔记之012:处理下拉框 分类: Selenium 2015-07-23 00:15 19人阅读 评论(0) 收藏
    Selenium学习笔记之012:处理下拉框
    Selenium学习笔记之011:操作对象 分类: Selenium 2015-07-22 23:33 15人阅读 评论(0) 收藏
    Selenium学习笔记之011:操作对象
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/12067448.html
Copyright © 2011-2022 走看看