我知道卡桑德拉的列上有TTLs。但是,是否也可以在一行上设置一个TTL?在每一列上设置一个TTL并不能解决我的问题,如下面的usecase所示:
在某个时候,进程想要删除带有TTL的完整行(假设TTL为1周)。它可以用相同的内容替换所有现有的列,但使用1周的TTL。
但是可能会在该行"A“上同时运行另一个进程,它插入新列或替换现有列而不使用TTL,因为该进程无法知道该行将被删除(它同时运行!)。因此,1周后,除这些新插入的列外,行"A“的所有列都将因TTL而被删除。我也希望他们被删除。
那么,对于这个用例是否有卡桑德拉支持,还是我必须自己实现?
亲切的问候
斯特凡
发布于 2013-05-15 07:42:24
目前无法将TTL设置在Cassandra的行中。TTL用于在写入各个列时已知其生存期时删除它们。
您可以通过延迟进程来实现您想要的结果--而不是想插入一个TTL 1周,一周后运行它并删除该行。行删除具有以下语义:在前面插入的任何列都将被删除,但在后面插入的列将不会被删除。
如果将来插入的列仍然需要删除,您可以在将来插入带有时间戳的行delete,以确保这一点,但要非常小心:如果以后想插入无法插入的行,则列在写入该行时就会消失(直到垃圾收集墓碑)。
发布于 2016-08-22 09:04:14
可以在Cassandra 3中为一行设置ttl,使用
INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;发布于 2016-07-05 18:56:25
虽然我不建议这样做,但卡桑德拉有办法解决这个问题:
SELECT TTL(value) FROM table WHERE ...;首先获取值的当前TTL,然后使用结果在INSERT或UPDATE中设置TTL:
INSERT ... USING TTL ttl-of-value;所以..。我认为SELECT TTL()很慢(根据我在一些CQL命令中使用TTL()和WRITETIME()的经验)。不仅如此,在Cassandra节点上生成select结果时,TTL是正确的,而且当插入发生时,TTL将被关闭。卡桑德拉应该提供一个删除的时间而不是一个活着的时间.
因此,正如Richard提到的,在1周后有自己的删除数据的过程可能更安全。您应该有一个列来保存创建日期或数据过时的日期。然后后台进程可以读取该日期,如果数据被视为过时,则删除整行。
其他进程也可以使用该日期来知道该行是否有效!(因此,即使它尚未被删除,如果日期被传递,仍然可以将该行视为无效。)
https://stackoverflow.com/questions/16544051
复制相似问题