Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cassandra中的版本控制_Cassandra_Cql3 - Fatal编程技术网

cassandra中的版本控制

cassandra中的版本控制,cassandra,cql3,Cassandra,Cql3,我需要使用cassandra进行版本控制 下面是我的列族定义 创建表文件\u详细信息(id text主键、fname text、version int、mimetype text) 我在fname列上创建了一个二级索引 每当我为同一个“fname”插入时,版本应该递增。当我用fname检索一行时,它应该返回最新版本的行 请建议需要采取的方法。如果无法放宽版本增加1的要求,一种选择是使用计数器 为数据创建一个表: create table file_details(id text primary

我需要使用cassandra进行版本控制

下面是我的列族定义

创建表文件\u详细信息(id text主键、fname text、version int、mimetype text)

我在fname列上创建了一个二级索引

每当我为同一个“fname”插入时,版本应该递增。当我用fname检索一行时,它应该返回最新版本的行


请建议需要采取的方法。

如果无法放宽版本增加1的要求,一种选择是使用计数器

为数据创建一个表:

create table file_details(id text primary key, fname text, mimetype text);
以及版本的单独表格:

create table file_details_version(id text primary key, version counter);
这需要是一个单独的表,因为表可以包含所有计数器,也可以不包含计数器

然后,对于更新,您可以执行以下操作:

insert into file_details(id, fname, mimetype) values ('id1', 'fname', 'mime');
update file_details_version set version = version + 1 where id = 'id1';
然后,从文件\u details读取将始终返回最新版本,您可以从文件\u details\u version中找到最新版本号

不过,这方面存在许多问题。您不能使用计数器进行原子批处理,因此这两个更新不是原子的-某些故障情况可能会导致仅保留插入文件的详细信息。此外,没有读取隔离,因此如果在更新期间读取,则可能会在两个表之间获得不一致的数据。最后,Cassandra中的计数器更新不能容忍失败,因此如果在计数器更新期间发生故障,则可能会重复计数,即版本增加过多


我认为所有涉及计数器的解决方案都会解决这些问题。您可以通过为每次更新生成一个唯一的ID(例如,一个大的随机数)并将其插入单独表中的一行来避免计数器。然后,版本将是行中的ID数。现在您可以进行原子更新,并且计数可以容忍失败。但是,读取时间将为O(更新次数),并且读取仍不会被隔离。

您是否要求版本每次精确增加1?如果不是,fname和mimetype的最大时间戳将是一个不断增加的数字,因此可以用于版本控制。另外,您能告诉我查询如何获得fname和mimetype的最大时间戳吗?您可以使用
select writetime(fname),writetime(mimetype)从文件_details中选择id='id'
并找到代码中的最大值。感谢Richard的快速响应,如果每次增量正好为1,您知道需要做什么吗?版本控制的两个最重要的用例包括I)版本控制(恢复到任何以前的版本)ii)使用更改的内容。您的方法无法执行这些操作。