首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一排排卡桑德拉

一排排卡桑德拉
EN

Stack Overflow用户
提问于 2013-05-14 13:07:22
回答 3查看 19.5K关注 0票数 15

我知道卡桑德拉的列上有TTLs。但是,是否也可以在一行上设置一个TTL?在每一列上设置一个TTL并不能解决我的问题,如下面的usecase所示:

在某个时候,进程想要删除带有TTL的完整行(假设TTL为1周)。它可以用相同的内容替换所有现有的列,但使用1周的TTL。

但是可能会在该行"A“上同时运行另一个进程,它插入新列或替换现有列而不使用TTL,因为该进程无法知道该行将被删除(它同时运行!)。因此,1周后,除这些新插入的列外,行"A“的所有列都将因TTL而被删除。我也希望他们被删除。

那么,对于这个用例是否有卡桑德拉支持,还是我必须自己实现?

亲切的问候

斯特凡

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-15 07:42:24

目前无法将TTL设置在Cassandra的行中。TTL用于在写入各个列时已知其生存期时删除它们。

您可以通过延迟进程来实现您想要的结果--而不是想插入一个TTL 1周,一周后运行它并删除该行。行删除具有以下语义:在前面插入的任何列都将被删除,但在后面插入的列将不会被删除。

如果将来插入的列仍然需要删除,您可以在将来插入带有时间戳的行delete,以确保这一点,但要非常小心:如果以后想插入无法插入的行,则列在写入该行时就会消失(直到垃圾收集墓碑)。

票数 13
EN

Stack Overflow用户

发布于 2016-08-22 09:04:14

可以在Cassandra 3中为一行设置ttl,使用

代码语言:javascript
复制
INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;
票数 8
EN

Stack Overflow用户

发布于 2016-07-05 18:56:25

虽然我不建议这样做,但卡桑德拉有办法解决这个问题:

代码语言:javascript
复制
SELECT TTL(value) FROM table WHERE ...;

首先获取值的当前TTL,然后使用结果在INSERT或UPDATE中设置TTL:

代码语言:javascript
复制
INSERT ... USING TTL ttl-of-value;

所以..。我认为SELECT TTL()很慢(根据我在一些CQL命令中使用TTL()和WRITETIME()的经验)。不仅如此,在Cassandra节点上生成select结果时,TTL是正确的,而且当插入发生时,TTL将被关闭。卡桑德拉应该提供一个删除的时间而不是一个活着的时间.

因此,正如Richard提到的,在1周后有自己的删除数据的过程可能更安全。您应该有一个列来保存创建日期或数据过时的日期。然后后台进程可以读取该日期,如果数据被视为过时,则删除整行。

其他进程也可以使用该日期来知道该行是否有效!(因此,即使它尚未被删除,如果日期被传递,仍然可以将该行视为无效。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16544051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档