在Cassandra中,这种行为似乎不符合直觉,我想知道为什么会发生这种情况,并可能绕过它。
想象一下,我有一个带有三列的表:pk
,主键,类型为text
,foo
,类型为bigint
,和另一个text
类型的bar
。
insert into keyspace.table (pk, foo, bar) values ('first', 1, 'test') using ttl 60;
这将在我的表中创建一行,其生存时间为60秒。看起来是这样的:
pk | foo | bar
------------------
first | 1 | test
现在我做的是:
update keyspace.table using ttl 10 set bar='change' where pk='first';
接下来,我看着这一行文字,它经历了以下变化:
pk | foo | bar
--------------------
first | 1 | change
first | 1 | <<null>> // after 10 seconds
<< deleted >> // after the initial 60 seconds
一切都很好。我想要的是仅仅改变bar
的存活时间,而不是其他东西,尤其不是主键。这种行为是可以预期的。
然而,如果我的更新没有ttl
,或者设置为0:
update keyspace.table set bar='change' where pk='first';
然后我看到这种行为随着时间而改变。
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
换句话说,该行永远不会被删除。因为 "foo" 没有被更改,所以它的生存时间仍然有效,在其过期后该值被删除(设置为0)。但是,pk 的生存时间确实已经更改了。这完全出乎意料。
如果我不在更新中指定生存时间,为什么主键的生存时间只会更改一次?如何解决这个问题,使主键的生存时间仅在明确要求更改时才更改?
编辑:我还发现,如果我使用比最初生存时间更长的生存时间,它似乎也会更改主键的生存时间。
update keyspace.table using ttl 70 set bar='change' where pk='first';
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
<< deleted >> // after the 70 seconds