SpringBoot 连接 cassandra

一、docker安装cassandra

1、下载cassandra镜像

[root@localhost ~]# docker pull cassandra
Using default tag: latest
latest: Pulling from library/cassandra
846c0b181fff: Pull complete
9923132fe6ab: Pull complete
fcd5cbc3b5e5: Pull complete
4d78778bf6ee: Pull complete
8a46c9313733: Pull complete
200797bd56b8: Pull complete
33d4c6e1eee9: Pull complete
ff00f670cf06: Pull complete
e22ff0b1ed21: Pull complete
Digest: sha256:566489b615eec3d43427f73d986aaa9568ff88f3a83ac6bea2175f5bfcd2469d
Status: Downloaded newer image for cassandra:latest
docker.io/library/cassandra:latest

2、运行cassandra

docker run --name cassandra -p 7000:7000 -p 7001:7001 -p 9042:9042 -p 7199:7199 -p 9160:9160 cassandra
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED       STATUS       PORTS                                                                                                                                                                                            NAMES
19f4f71155bb   cassandra   "docker-entrypoint.s…"   6 hours ago   Up 2 hours   0.0.0.0:7000-7001->7000-7001/tcp, :::7000-7001->7000-7001/tcp, 0.0.0.0:7199->7199/tcp, :::7199->7199/tcp, 0.0.0.0:9042->9042/tcp, :::9042->9042/tcp, 0.0.0.0:9160->9160/tcp, :::9160->9160/tcp   cassandra

3、创建keyspace

[root@localhost ~]# docker exec -it cassandra /bin/bash
root@19f4f71155bb:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.0.0 | Cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.

cqlsh> desc keyspaces

system       system_distributed  system_traces  system_virtual_schema
system_auth  system_schema       system_views

cqlsh> CREATE KEYSPACE test
   ... WITH replication = {'class': 'SimpleStrategy','replication_factor':'1'};

cqlsh> desc keyspaces;

system       system_distributed  system_traces  system_virtual_schema
system_auth  system_schema       system_views   tes

4、创建表并插入数据

cqlsh> use test;
cqlsh:test> create table test.user(
        ... id int primary key,
        ... name text,
        ... age int);

cqlsh:test> insert into user(id,name,age) values(1,'join',10);
cqlsh:test> insert into user(id,name,age) values(2,'tom',12);

cqlsh:test> select * from user;

 id | age | name
----+-----+------
  1 |  10 | join
  2 |  12 |  tom
cqlsh:test> create index on user(age

注意:如果查询带条件,需要加上 “ALLOW FILTERING语句”

cqlsh:test> select * from user where name = 'tom' Allow filtering;

 id | age | name
----+-----+------
  2 |  12 |  tom

二、配置springboot依赖

1、pom依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra</artifactId>
        </dependency>

    </dependencies>

2、application.yml配置

spring:
  data:
    cassandra:
      port: 9042
      keyspace-name: test
      contact-points:
        - 192.168.246.134:9042
      local-datacenter: datacenter1

代码结构
在这里插入图片描述

3、实体类

@Data
@Table(value="user")
private class User implements Serializable {
  @PrimaryKey
  private Integer id;
  private String name;
  @Indexed
  private Integer age;
}

4、UserMapper

public interface UserMapper extends CrudRepository<User, String> {
  @Query(value = "select id, name, age from user where name = ?0 ALLOW filtering")
  List<User> findByName(String name);
}

5、UserService

public interface UserService {
 List<User> getUserByName(String name);
}

6、UserServiceImpl

@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
  final UserMapper userMapper;
  @Override
  public List<User> getUserByName(String name){
    return userMapper.findByName(name);
  }
}

7、UserController

@RestController
@AllArgsConstructor
public class UserController {
  final UserService userService;
  
  @GetMapping(value = "user/{name}")
  public List<User> getUser(@PathVariable String name){
    return userService.getUserByName(name);
  }
}

三、发送请求看查询结果

在这里插入图片描述

四、MongoDB与Cassandra数据库对比

MongoDB和Cassandra都属于NoSQL数据库系列,它们也恰好都是开源,但是,它们的相似之处仅此而已。

MongoDB和Cassandra之间的相似之处

在深入探讨MongoDB和Cassandra的不同之处之前,让我们先看看它们的相似之处。 显然,它们都是数据库。更重要的是,它们都是NoSQL数据库。NoSQL是一种数据库架构类型,其中数据主要以相对非结构化的方式存储。与更传统的SQL式数据库相比,NoSQL可以更有效地存储大量非结构化数据,企业在大数据操作中通常会涉及非结构化数据。

MongoDB和Cassandra也都是开源数据库,尽管现在也有商业部署可用。但即使在这方面,它们也不尽相同,MongoDB由GNU Affero General Public License 3.0授权,而Cassandra由Apache License 2.0授权。 这两个数据库都已经存在了大约十年。Cassandra于2008年首次亮相,MongoDB则于2009年推出。从这方面来看,与20世纪90年代中期出现的MySQL等数据库相比,它们算是新型数据库。

最后,这两个数据库都支持三大操作系统:Windows、Linux和macOS。不过,Cassandra也可在基于Berkeley Software Distribution的操作系统上运行。 MongoDB与Cassandra:主要区别 然而,在大多数其他重要方面,MongoDB和Cassandra各有各的不同。 高可用性策略 MongoDB和Cassandra各自的数据可用性策略可能是它们之间最大的不同。 在Cassandra部署中,你可以设置多个主节点。如果一个或多个主节点发生故障,只要至少有一个主节点仍然存在,那你的数据库仍然将保持可用状态。这种高度分布式和冗余的模型使得在Cassandra中很容易实现高可用性(HA),当然,前提是你可以使用备用基础架构来设置多个主节点。 另一方面,MongoDB也没有忽略高可用性的问题,但其策略是基于自动故障转移的想法。你只能在MongoDB集群中设置一个主节点。如果主站发生故障,从站节点将自动转变为新的主站点。这确保了连续性,但这不会立即发生,通常需要将近一分钟。 你是否可以接受一分钟的数据存储中断,可能取决于你正在尝试做的事情。但是,无论你怎么对比,Cassandra都比MongoDB更具弹性和高可用性。 写入速度 MongoDB对单个主节点的限制也影响着数据写入数据库的速度。数据写入必须记录在主服务器上,并且由于MongoDB集群只有一个主服务器,因此它向数据库写入新信息的能力受到该单个主节点容量的严格限制。 而通过Cassandra,每个主节点可以并行接受不同的写入。因此,你拥有的主节点越多,你可以一次写入的数据就越多。如果你需要写很多数据,你应该选择Cassandra。 数据结构 虽然这两个数据库都属于NoSQL系列,但NoSQL是一个广泛的类别。当你了解深入了解时,你会发现,NoSQL数据库架构可能会有很大差异,MongoDB和Cassandra也是如此。 与Cassandra相比,MongoDB提供了更加非结构化的架构。MongoDB使你可以定义对象,这些对象基本上可以包含你想要的任何属性。此外,你基本上可以任何方式在层级结构组织对象。 相比之下,Cassandra提供了一种类似于桌面的存储模型,它更像传统的SQL风格数据库,不过,Cassandra并不像传统数据库那样严格。 查询语言 除了从数据结构角度更类似于SQL风格的数据库外,Cassandra的查询语言(称为CQL)也非常类似于传统数据库的查询语言。 CQL和SQL并不完全相同,但通常,在SQL上运行的查询可在CQL上运行。如果你的数据分析师已经熟悉SQL,那他/她也会很快学会CQL。 MongoDB有自己的查询界面,它基本上是JSON格式,你可以很容易地学习它。但这不是你已经熟悉的事情。 MongoDB与Cassandra:使用案例 那么,什么时候MongoDB是比Cassandra更好的解决方案,或者反过来呢? 一般来说,MongoDB最适合具有大量高度非结构化数据的工作负载。如果对于你将使用的数据的规模和类型,你并不了解或者具有最小的预测能力,那么,MongoDB的灵活数据结构将比Cassandra更适合你。 同时,若要有效地使用MongoDB,你必须能够应对主节点出现故障而造成停机的情况,以及有限的写入速度。同时,不要忘记,你还必须学习一种新的查询语言。 另一方面,Cassandra最适合SQL式数据类型的用例。如果你需要非常快的写入速度,Cassandra也能很好地工作。如果新查询语言的学习曲线吓倒了你,你还可从CQL和SQL之间的相似性中受益。 简而言之,如果你想要一个与MySQL类似的数据库,而又希望提供更多的灵活性和可扩展性,请选择Cassandra。如果你需要更高程度的灵活性并且愿意学习一些新技巧,MongoDB将是你的选择。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中整合Cassandra可以通过以下几个步骤完成: 1. 添加Cassandra依赖:在`pom.xml`文件中添加Cassandra的驱动依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-cassandra</artifactId> </dependency> ``` 2. 配置Cassandra连接信息:在`application.properties`文件中配置Cassandra连接信息,例如: ```properties spring.data.cassandra.contact-points=your-cassandra-host spring.data.cassandra.port=9042 spring.data.cassandra.keyspace-name=your-keyspace-name ``` 3. 创建实体类:创建与Cassandra表对应的实体类,使用`@Table`注解指定表名,使用`@PrimaryKey`注解指定主键,例如: ```java @Table("users") public class User { @PrimaryKey("id") private UUID id; @Column("name") private String name; // getters and setters } ``` 4. 创建Repository:创建一个继承自`CassandraRepository`的接口,用于定义对Cassandra表的操作,例如: ```java @Repository public interface UserRepository extends CassandraRepository<User, UUID> { List<User> findByName(String name); } ``` 5. 使用Repository:在需要访问Cassandra数据的地方使用自动注入的Repository进行操作,例如: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByName(String name) { return userRepository.findByName(name); } } ``` 这样就完成了Spring BootCassandra的整合。你可以根据具体的业务需求,使用Repository提供的方法进行数据操作。如果需要更复杂的查询,可以使用Cassandra的查询语言CQL来编写自定义查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值