CQL 基础入门:像操作 MySQL 一样使用 Cassandra
在学习 Cassandra 时,真正需要先掌握的并不是复杂的分布式原理,而是:
怎么创建库、创建表、插入、查询、修改、删除数据。
Cassandra 提供了一套专门的查询语言:
CQL
Cassandra Query Language
它的语法和 SQL 很像。
所以如果之前已经熟悉 MySQL,其实 CQL 上手并不困难。
一、先理解 Cassandra 中几个基本概念
可以先和 MySQL 做个对应。
MySQL Cassandra
数据库 Database ≈ Keyspace
表 Table ≈ Table
一行数据 Row ≈ Row
主键 ≈ Primary Key
SQL ≈ CQL
其中最重要的是:
Keyspace
可以暂时理解成:
Cassandra 中的“数据库”。
例如:
xiaohashu
就是一个 Keyspace。
里面可以继续创建:
note_content
user_content
comment_content
等表。
二、Cassandra 的整体结构
可以简单理解成:
Cassandra Cluster
↓
Keyspace
↓
Table
↓
Row
↓
Column
如果类比 MySQL:
MySQL Server
↓
Database
↓
Table
↓
Row
↓
Column
所以对于刚入门的人来说,两者表面使用体验其实比较接近。
三、什么是 Node 和 Cluster?
Cassandra 是一个分布式数据库。
一个 Cassandra 服务器可以看成:
Node
多个 Node 组成:
Cluster
例如:
Cassandra Cluster
├── Node 1
├── Node 2
└── Node 3
数据可以分散存储到多个节点中。
而且 Cassandra 节点之间没有传统意义上的主从关系,可以简单理解成:
多个节点一起提供数据存储和查询能力。
四、什么是 Keyspace?
Keyspace 是 Cassandra 中非常重要的概念。
可以把它理解成:
MySQL Database
例如创建:
CREATE KEYSPACE IF NOT EXISTS xiaohashu
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 1
};
意思就是:
创建一个名字叫
xiaohashu的 Keyspace。
五、replication 是什么?
这里:
replication
表示:
Cassandra 中的数据应该如何复制。
例如:
replication_factor = 1
表示:
一份数据
↓
只保存 1 份副本
这种配置比较适合:
开发环境
测试环境
单节点学习环境
因为如果这个节点挂了:
数据可能就没了
所以生产环境通常不会简单只保留一份。
六、查看所有 Keyspace
类似 MySQL:
SHOW DATABASES;
Cassandra 可以使用:
DESCRIBE KEYSPACES;
查看当前存在的所有 Keyspace。
七、选择 Keyspace
MySQL 中:
USE xiaohashu;
Cassandra 也是:
USE xiaohashu;
执行之后:
后面的 CREATE TABLE
INSERT
SELECT
UPDATE
DELETE
都会针对当前 Keyspace。
八、删除 Keyspace
如果整个 Keyspace 都不要了:
DROP KEYSPACE IF EXISTS xiaohashu;
需要注意:
删除 Keyspace 会连里面的数据一起删除。
可以把它理解成 MySQL 的:
DROP DATABASE
九、创建表
项目中创建了一张:
note_content
用于保存笔记正文。
结构非常简单:
CREATE TABLE note_content (
id UUID PRIMARY KEY,
content TEXT
);
只有两个字段:
id
content
可以理解成:
id → Key
content → Value
所以这张表实际上被当成:
K-V 键值存储
来使用。
十、为什么 id 使用 UUID?
这里没有直接使用普通自增 ID,而是:
UUID
例如:
728c9c82-c64b-410b-8970-0dcae49efaa7
原因和 Cassandra 的分布式特性有关。
Cassandra 会根据:
Partition Key
决定数据应该存放到哪个节点。
例如:
UUID
↓
计算 Hash
↓
决定存储节点
UUID 本身随机性比较强,因此通常更容易让数据:
比较均匀地分散
到不同节点。
从而减少某个节点特别热的问题。
十一、Primary Key 在 Cassandra 中很重要
例如:
id UUID PRIMARY KEY
它不只是为了:
唯一标识一条数据
同时还参与决定:
这条数据应该分布到 Cassandra 集群的哪个位置。
所以 Cassandra 中:
Primary Key
Partition Key
比普通 MySQL 里面单纯理解“唯一 ID”更加重要。
十二、插入数据
插入一条笔记:
INSERT INTO note_content (id, content)
VALUES (uuid(), '这是一条测试笔记');
其中:
uuid()
表示:
Cassandra 自动帮我们生成一个 UUID。
最终数据大概是:
id:
728c9c82-c64b-410b-8970-0dcae49efaa7
content:
这是一条测试笔记
十三、查询数据
查询整张表:
SELECT * FROM note_content;
和 MySQL 非常像。
如果根据 id 查询:
SELECT *
FROM note_content
WHERE id = 728c9c82-c64b-410b-8970-0dcae49efaa7;
整个思路就是:
拿着 Key
↓
查 Value
对于当前项目来说:
笔记内容 UUID
↓
Cassandra
↓
笔记正文
十四、更新数据
修改笔记正文:
UPDATE note_content
SET content = '更新后的评论内容'
WHERE id = 728c9c82-c64b-410b-8970-0dcae49efaa7;
整体逻辑和 MySQL 一样:
根据 id 找到记录
↓
修改 content
十五、删除数据
删除:
DELETE FROM note_content
WHERE id = 728c9c82-c64b-410b-8970-0dcae49efaa7;
也是:
根据 Key
↓
删除对应数据
十六、把所有基本命令串起来
完整流程可以记成:
创建 Keyspace
↓
选择 Keyspace
↓
创建 Table
↓
INSERT
↓
SELECT
↓
UPDATE
↓
DELETE
对应命令:
CREATE KEYSPACE
USE
CREATE TABLE
INSERT
SELECT
UPDATE
DELETE
和 MySQL 的学习路径几乎一样。
十七、这套项目为什么使用 Cassandra?
当前项目想把 Cassandra 当成:
K-V 键值存储
例如一篇笔记:
Key
=
UUID
对应:
Value
=
笔记正文
也就是:
UUID
↓
Cassandra
↓
content
例如:
728c9c82...
↓
“今天学习了 Spring Cloud 微服务……”
因此创建的表也非常简单:
note_content
├── id
└── content
核心目的就是:
根据一个唯一 Key 快速找到对应的笔记内容。
十八、为什么不直接把所有内容放 MySQL?
这里需要结合当前项目的设计思路理解。
例如笔记可能存在两类数据。
一类是:
标题
用户 ID
点赞数
评论数
发布时间
状态
这种结构化数据,很适合:
MySQL
另一类是:
很长的笔记正文
项目选择把它单独交给:
Cassandra
于是可能形成:
MySQL
负责笔记基本信息
Cassandra
负责笔记正文
可以理解成:
note 表
id
user_id
title
content_uuid
like_count
...
其中:
content_uuid
再去 Cassandra 找:
content_uuid
↓
note_content
↓
content
这就是后面 KV 微服务和笔记内容服务的基础。
十九、和 Redis 有什么区别?
刚开始看到:
Key → Value
很容易想到 Redis。
两者虽然都可以处理 Key-Value 场景,但关注点并不完全一样。
当前项目这里主要想表达的是:
Redis
更常用于缓存、临时状态等
而:
Cassandra
用于持久化保存大量数据
在这套项目中:
Token
权限
缓存
更多可以看到 Redis。
而:
笔记正文
则选择 Cassandra 做持久化存储。
二十、CQL 和 SQL 的关系
刚开始完全可以这样理解:
SQL
↓
操作 MySQL
CQL
↓
操作 Cassandra
而且很多基础语法非常像:
CREATE
INSERT
SELECT
UPDATE
DELETE
所以你会感觉:
CQL 上手并不难。
不过需要注意:
Cassandra 虽然看起来有表、有行、有 CQL,但它不是关系型数据库。
它底层的数据组织、分区、复制、查询方式和 MySQL 有明显区别。
所以前期可以:
先用 SQL 的经验帮助入门
但后面不能完全按照 MySQL 的思维设计 Cassandra。
二十一、入门阶段最需要记住的东西
目前不需要一下研究 Cassandra 所有高级特性。
先记住下面这些就足够继续项目:
Keyspace
≈ 数据库
Table
≈ 表
CQL
≈ Cassandra 的 SQL
UUID
= 当前项目中的 Key
content
= 当前项目中的 Value
Primary Key / Partition Key
会影响数据如何分布
replication
决定数据副本
然后掌握:
CREATE KEYSPACE
USE
CREATE TABLE
INSERT
SELECT
UPDATE
DELETE
基本就能继续后面的 Spring Boot 整合 Cassandra。
二十二、整个业务思路
最终可以把当前 Cassandra 设计理解成:
用户发布笔记
↓
产生笔记正文
↓
生成 UUID
↓
UUID 作为 Key
↓
正文作为 Value
↓
存入 Cassandra
以后查询:
拿到 UUID
↓
查询 Cassandra
↓
得到笔记正文
删除:
拿到 UUID
↓
删除 Cassandra 中对应正文
所以这一阶段真正需要理解的,不只是几条 CQL 命令。
而是:
项目准备使用 Cassandra 保存笔记正文,并通过 UUID 把一段正文当成一个 Key-Value 数据进行管理。
总结
CQL 是 Cassandra 的查询语言,基础语法和 SQL 非常类似。
可以先这样记:
Keyspace = 数据库
Table = 表
CQL = Cassandra 的 SQL
UUID = Key
content = Value
基本操作:
CREATE
INSERT
SELECT
UPDATE
DELETE
而在当前项目中,Cassandra 的核心用途可以概括为:
笔记正文
↓
生成 UUID
↓
UUID : Content
↓
存入 Cassandra
所以后面继续学习 Spring Boot 整合 Cassandra 时,本质上就是把现在手写的:
INSERT
SELECT
DELETE
改成由 Java 代码帮我们完成。
CQL 这一节真正需要掌握的核心不是背命令,而是理解 Cassandra 中“Keyspace → Table → Key → Value”的数据组织方式,以及项目为什么准备用它保存笔记正文。