标签:
CassandraCQLNoSQLDocker分布式数据库
一、前言
学习 CQL(Cassandra Query Language) 的基本命令,并通过实际操作来熟悉 Cassandra 的数据操作方式。
CQL 的语法与 SQL 非常相似,但底层是基于 Cassandra 的分布式 KV 架构设计的,理解这一点对后续开发至关重要。
二、进入 Cassandra 命令行
2.1 进入容器
bash
docker exec -it cassandra /bin/sh
-it表示以交互式终端进入容器,cassandra是我们之前启动的容器名称。
2.2 打开 CQL Shell
进入容器后,输入以下命令进入 CQL 交互式命令行:
bash
cqlsh
如果看到类似下面的输出,说明连接成功:
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 6.1.0 | Cassandra 4.1.0 | CQL spec 3.4.6 | Native protocol v4]
Use HELP for help.
cqlsh>
三、Keyspace(键空间)操作
Keyspace 相当于 MySQL 中的 Database,是 Cassandra 中最顶层的命名空间,用于定义数据的复制策略。
3.1 查看所有 Keyspace
sql
DESCRIBE KEYSPACES;
3.2 创建 Keyspace
sql
CREATE KEYSPACE IF NOT EXISTS xxx
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 1
};
参数说明:
class: 复制策略,SimpleStrategy适合单数据中心replication_factor: 副本数,本地测试设为 1,生产环境建议设为 3
3.3 切换 Keyspace
sql
USE xxx;
切换后,命令行提示符会变成:
cqlsh:xxxx> //xxx表名
四、表(Table)操作
4.1 创建笔记内容表
在项目中,我们需要存储笔记的正文内容,设计如下:
sql
CREATE TABLE IF NOT EXISTS note_content (
note_id BIGINT PRIMARY KEY,
content TEXT,
create_time TIMESTAMP,
update_time TIMESTAMP
);
设计说明:
note_id: 笔记唯一标识,作为分区键(Partition Key)content: 笔记正文,使用TEXT类型存储大文本create_time/update_time: 创建和更新时间
4.2 查看表结构
sql
DESCRIBE TABLE note_content;
4.3 查看所有表
sql
DESCRIBE TABLES;
五、数据增删改查(CRUD)
5.1 插入数据
sql
INSERT INTO note_content (note_id, content, create_time, update_time)
VALUES (10001, '今天天气真好,适合去公园散步!', toTimestamp(now()), toTimestamp(now()));
5.2 查询数据
sql
-- 查询所有笔记内容
SELECT * FROM note_content;
-- 根据 note_id 查询单条记录
SELECT * FROM note_content WHERE note_id = 10001;
-- 只查询 content 字段
SELECT content FROM note_content WHERE note_id = 10001;
⚠️ 注意 :Cassandra 中
WHERE条件必须包含分区键,否则需要创建二级索引。
5.3 更新数据
sql
UPDATE note_content
SET content = '更新后的笔记内容...', update_time = toTimestamp(now())
WHERE note_id = 10001;
5.4 删除数据
sql
-- 删除指定列
DELETE content FROM note_content WHERE note_id = 10001;
-- 删除整行
DELETE FROM note_content WHERE note_id = 10001;
5.5 清空表(慎用)
sql
TRUNCATE note_content;
六、常用 CQL 命令速查表
| 命令 | 说明 | 示例 |
|---|---|---|
CREATE KEYSPACE |
创建键空间 | CREATE KEYSPACE xxx WITH replication = {...} |
USE |
切换键空间 | USE xxx; |
DROP KEYSPACE |
删除键空间 | DROP KEYSPACE xxx; |
CREATE TABLE |
创建表 | CREATE TABLE note_content (...) |
DESCRIBE |
查看结构 | DESCRIBE TABLES; |
INSERT |
插入数据 | INSERT INTO note_content ... |
SELECT |
查询数据 | SELECT * FROM note_content |
UPDATE |
更新数据 | UPDATE note_content SET ... |
DELETE |
删除数据 | DELETE FROM note_content WHERE ... |
TRUNCATE |
清空表 | TRUNCATE note_content; |
七、CQL 与 SQL 的核心区别
| 特性 | CQL (Cassandra) | SQL (MySQL) |
|---|---|---|
| 数据模型 | 宽列存储(分布式 KV) | 关系型表结构 |
| 连接查询 | ❌ 不支持 JOIN | ✅ 支持 JOIN |
| 事务支持 | 仅支持轻量级 BATCH | ✅ 完整 ACID |
| 主键作用 | 决定数据分布位置 | 唯一性约束 |
| 聚合查询 | 功能有限 | 功能丰富 |
| 扩展性 | 水平扩展(分布式) | 垂直扩展为主 |
💡 设计建议:在 Cassandra 中,表结构应该根据查询需求来设计(Query-first design),而不是像关系型数据库那样先设计实体关系。
八、总结
本节我们学习了 Cassandra CQL 的基本命令,包括:
- ✅ 通过 Docker 进入 Cassandra 容器和 CQL Shell
- ✅ Keyspace 的创建、切换和删除
- ✅ 表的创建和结构查看
- ✅ 数据的增删改查操作
- ✅ CQL 与 SQL 的核心差异
九、参考与扩展阅读
如果本文对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 ✅,我们下节见!