我已经了解了轻量级事务以及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并检查是否存在,否则如果两个线程同时写入它们认为集合中的初始路径的内容,会出现同样的问题吗?