在弹簧启动中为Cassandra DB使用findOne()/ findAll()

时间:2018-04-11 21:46:41

标签: spring-boot cassandra spring-data-cassandra

在代码优化过程中,我发现我在for循环中使用findOne()的几个方面 -

public List<User> validateUsers(List<String> userIds) {
    List<User> validUsers = new ArrayList<>();
    for ( String userId : userIds) {
        User user = userRepository.findOne(userId); //Network hit :: expensive call
        //Perform validations 
        ...
        //Add valid users to validUsers list
        ...
    }
    return validUsers;
}

如果我传递大量用户进行验证,则上面的方法需要很长时间。 [对于300名用户约5秒。]

然后我更改了上面的方法以使用findAll()并对结果集合执行验证 -

public List<User> validateUsers(List<String> userIds) {
    List<User> validUsers = new ArrayList<>();
    Iterable<User> itr = userRepository.findAll(userIds); //Only one Network hit

    for ( User user : itr) {

        //Perform validations 
        ...
        //Add valid users to validUsers list
        ...
    }
    return validUsers;
}

现在有300名用户,结果将在100毫秒内完成。 问题是:考虑到Cassandra的底层结构,使用findAll()是否有任何副作用?我也在使用CrudRepository。我应该使用CassandraRepository吗?

1 个答案:

答案 0 :(得分:0)

以下是您尝试此操作时要考虑的参数。

  1. 如果您使用的是findAll,那么users表有多大。
  2. 用户表的分区键
  3. 由于使用主键字段的Cassandra查询速度更快,因此findOne可能会在大量数据的情况下表现更好。

    但是,你可以尝试

    stylesheets/terms_of_use.scss

    来自List<T> findAllById(Iterable<ID> ids);