cassandra中的版本控制
我需要使用cassandra进行版本控制 下面是我的列族定义 创建表文件\u详细信息(id text主键、fname text、version int、mimetype text)强> 我在fname列上创建了一个二级索引 每当我为同一个“fname”插入时,版本应该递增。当我用fname检索一行时,它应该返回最新版本的行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
请建议需要采取的方法。如果无法放宽版本增加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)使用更改的内容。您的方法无法执行这些操作。