同时进行写入和避免覆盖

时间:2018-10-03 14:36:12

标签: datastax cassandra-3.0

我已经了解了轻量级事务以及cassandra中的写入方式,但是我不确定如何解决有时记录在哪里被覆盖的问题,但是大部分时间不是。

我将文件路径存储在cassandra中,其中路径的关键是文件本身的sha1和其中包含较大的周围“图像文件”的sha1,在不同路径中存在实际文件的副本:

表定义

CREATE TABLE IF NOT EXISTS path_data (
   image_sha1 blob, 
   file_sha1 blob, 
   path text, 
   PRIMARY KEY((image_sha1, file_sha1), path));

代码:

CassError insert_path_data(const char * image_sha1, const char * file_sha1, char * path)
    { 
      CassError rc = CASS_OK;
      CassStatement * statement = NULL;
      CassFuture * future = NULL;
      statement = cass_prepared_bind(insert_path_data_prepared);

      cass_statement_bind_bytes_by_name(statement, "image_sha1", (const cass_byte_t*) image_sha1, 20);
      cass_statement_bind_bytes_by_name(statement, "file_sha1", (const cass_byte_t*) file_sha1, 20);
      cass_statement_bind_string_by_name(statement, "path", path);

      future = cass_session_execute(session, statement);
      cass_future_wait(future);
      if (rc != CASS_OK)
        print_error(future);

      cass_future_free(future);

      return rc;
    }

准备代码具有:INSERT INTO path_data (image_sha1, file_sha1, path) VALUES (?,?,?);

这些写操作是从多个线程发送的,我看到大多数路径都是针对同一文件积累并聚集在一起的,这就是我想要的:

abc..  ef1..  /usr/local/file1
abc..  ef1..  /usr/local/otherpath/file1
abc..  ef1..  /var/a/third/path/fileone_again

在这种情况下,它是同一个文件,可能带有差异名称,并且位于周围图像的三个位置。这是理想的行为,但我还会发现缺少路径条目的情况,因此我怀疑有两个(初始)插入新文件的问题。我的问题是,什么是最好的方法来确保捕获所有路径,同时仍然允许将来的查找,而密钥仅是两个sha1。我不知道先检查存在将有什么帮助,因为我不知道根据初始记录的存在或不存在我可以更改哪些行为。我不想更新任何东西,我只希望集群可以将同一文件在同一图像中的路径保持在一起。我应该先使用a并检查是否存在,否则如果两个线程同时写入它们认为集合中的初始路径的内容,会出现同样的问题吗?

0 个答案:

没有答案