Module 03 · Introducing Apache Cassandra: An Open-Source NoSQL Database
CRUD Operations - Part 1Apache Cassandra CRUD 操作:插入与更新
欢迎观看关于 Apache Cassandra 插入与更新操作 的视频。在本视频中,您将能够:
- 描述 Cassandra 中的 写操作,
- 解释 INSERT 和 UPDATE 操作的过程,
- 了解 轻量级事务(Lightweight Transactions)的作用。
写操作流程
集群级别的写操作
在 Cassandra 中,当进行写操作时,接收写请求的节点会成为 协调节点。协调节点负责确保操作的完成,并将写操作的结果返回给用户。写操作会被发送到目标分区的所有副本节点,但为了操作成功,必须有至少满足一致性要求的节点确认。
示例
假设我们有一个复制因子为 3 的键空间,且一致性级别为 2。写操作到达节点 4,节点 4 会将写请求转发到节点 1、2 和 3。然而,如果节点 2 不可用,只有节点 1 和 3 会返回确认。协调节点会检查确认的节点数量,并与预期的一致性值进行比较,最终返回操作结果。
Cassandra 中的写入操作
在 Cassandra 中,写操作的一个重要特点是,默认情况下 写操作不会先读取数据。数据会直接写入内存中的 Memtable,然后定期刷新到磁盘上的 SSTable 文件中。当 Memtable 填满时,数据会被刷新到磁盘。
每个写操作都会附加一个 时间戳,用于数据的冲突解决,保证最新的数据优先。
INSERT 操作
INSERT 操作要求完整的主键列,且每次插入数据时,主键都必须被完全指定。由于 Cassandra 默认不进行读取操作,INSERT 操作同时也充当 Upsert 操作——如果插入的数据已存在,则会更新该数据。
插入数据示例
INSERT INTO users (username, groupid, age) VALUES ('john_doe', 12, 30);
- Time-to-Live (TTL):可以在插入时设置 TTL,让数据在指定时间后自动过期。
INSERT INTO users (username, groupid, age) VALUES ('jane_doe', 25, 32) USING TTL 10;
该数据将在 10 秒后过期,不再可查询。
UPDATE 操作
UPDATE 操作允许修改已存在的记录。当您更新数据时,如果记录不存在,Cassandra 会将其视为插入操作。
更新数据示例
- 更新单一列:假设我们要更新
groupid = 45的记录中的 用户名,由于这是静态列,仅需指定 分区键。
UPDATE groups SET group_name = 'new_group_name' WHERE groupid = 45;
- 更新已存在的记录:如果更新数据已存在的记录,如更新用户的 年龄,操作类似于插入。
UPDATE users SET age = 45 WHERE username = 'john_doe' AND groupid = 12;
轻量级事务(Lightweight Transactions)
默认情况下,Cassandra 不会在执行写操作之前进行读取。因此,INSERT 和 UPDATE 操作在行为上非常相似。然而,您可以通过 轻量级事务 来强制在执行写操作之前进行读取。
轻量级事务的使用
在 INSERT 或 UPDATE 语句中使用 IF 子句,Cassandra 将在执行写操作前先检查数据是否满足某些条件。
示例 1:条件更新
UPDATE users SET age = 35 WHERE username = 'john_doe' IF age = 30;
这表示只有在 age 列的值为 30 时,才会更新为 35。
示例 2:条件插入
INSERT INTO users (username, groupid, age) VALUES ('jane_doe', 25, 30) IF NOT EXISTS;
如果记录已经存在,则不会执行插入操作。
性能影响
轻量级事务比普通的 INSERT 和 UPDATE 操作慢,约为其四倍。因此,应该谨慎使用。
总结
在本视频中,您学习了:
- 写操作:Cassandra 默认不执行读取操作,INSERT 和 UPDATE 操作具有相似的行为。
- 轻量级事务:通过
IF子句在 INSERT 和 UPDATE 中强制执行读取操作,但会影响性能,使用时需要谨慎。 - 集群级别的写操作:写操作会发送到所有副本节点,并根据一致性级别进行确认。
这些操作帮助您管理 Cassandra 中的数据插入与更新。