1. 概述

在这个教程中,我们将探讨ScyllaDB——一个快速且可扩展的NoSQL数据库。我们将了解其特性,并学习如何与它交互。

2. ScyllaDB是什么?

ScyllaDB是一个开源的分布式NoSQL数据库。 它支持与Cassandra相同的协议,但具有显著更高的吞吐量和更低的延迟。它使用C++语言开发。

ScyllaDB有三种变体:

  • ScyllaDB开源版:免费且开源,我们将拥有全部所有权,需要自行维护。
  • ScyllaDB企业版:付费版本,提供一些高级功能和24/7支持。我们需要自己的基础设施来安装此版本。
  • ScyllaDB云服务:由ScyllaDB提供的基于云的服务,无需自建基础设施或进行任何安装和维护。

2.1. 安装

我们将使用开源版本,并在Docker容器中运行,使用以下命令:

$ docker run --name scylla -p 9042:9042 -d scylladb/scylla

我们在这里暴露了端口号9042,将通过这个端口连接到数据库。

现在,让我们连接到数据库,创建一个表并插入一些数据。我们将编写Java代码来获取这些数据。

执行以下命令以连接到数据库:

$ docker exec -it scylla cqlsh

接下来,让我们创建一个带有简单复制策略(因子为3)的命名空间:

CREATE KEYSPACE IF NOT EXISTS baeldung WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

执行以下查询来创建表并插入数据:

CREATE COLUMNFAMILY IF NOT EXISTS baeldung.User (id bigint PRIMARY KEY, name text);
INSERT INTO baeldung.User (id, name) values (1, 'john doe');

3. Java代码实现

我们将编写一个简单的Java程序,连接到本地部署的Scylla DB并执行查询。

3.1. Maven依赖项

pom.xml文件中添加Scylla核心库依赖:

<dependency>
    <groupId>com.scylladb</groupId>
    <artifactId>java-driver-core</artifactId>
    <version>4.14.1.0</version>
</dependency>

3.2. Java代码

首先,将连接URL添加到application.yml文件中:

datastax-java-driver:
  basic:
    contact-points: 127.0.0.1:9042

有关所有可配置值的更多详细信息,请参阅此处的文档

现在,让我们获取之前添加的用户名:

try (CqlSession session = CqlSession.builder().build()) {
    ResultSet rs = session.execute("select * from baeldung.User");
    Row row = rs.one();
    return row.getString("name");
}

我们还可以使用*query-builder*来插入和检索数据。首先,我们需要在pom.xml文件中添加*java-driver-query-builder* Maven依赖:

<dependency>
    <groupId>com.scylladb</groupId>
    <artifactId>java-driver-query-builder</artifactId>
    <version>4.14.1.0</version>
</dependency>

现在,我们在代码中编写SELECT和INSERT构建语句来获取和插入数据:

try (CqlSession session = CqlSession.builder().build()) {
    InsertInto insert = insertInto("baeldung", "User");
    SimpleStatement statement = insert.value("id", literal(2))
      .value("name", literal("dev user"))
      .build();
    ResultSet rs = session.execute(statement);
}

这将在User表(命名空间baeldung)中插入一个新用户,id为2,名称为"dev user"。接下来,让我们创建一个SELECT语句,根据名称查找这个用户:

try (CqlSession session = CqlSession.builder().build()) {
    Select query = selectFrom("baeldung", "User").all()
      .whereColumn("name").isEqualTo(literal("dev user"))
      .allowFiltering();;
    SimpleStatement statement = query.build();
    ResultSet rs = session.execute(statement);
    Row row = rs.one();
    assertEquals(2, row.getLong("id"));
    assertEquals("dev user", row.getString("name");
}

我们可以看到,它将返回我们插入的数据,id为2。

4. 总结

在这里,我们对ScyllaDB进行了快速介绍,学习了如何安装、连接以及执行查询,以及如何从我们的应用程序中与之交互。

如往常一样,示例的完整源代码可以在GitHub上找到。