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 |
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); }
// 结果 (按照指定的顺序进行排列了)