可以根据最后一条记录插入记录吗?

时间:2016-09-26 12:44:03

标签: cassandra nosql

我想在某些产品中注册价格变化,但我想不填写重复数据的键空间,只有当最后一条记录不等于新数据时才应插入数据。

这是表格的定义:

create table price_tracker (

    product_id int,
    date timestamp,
    type text,
    price float
    PRIMARY KEY(product_id, date)

) with clustering order by (date desc);

只有我发生了搜索此产品的最后一条记录并比较其价格,如果不相等,请插入。

select dateOf(date), type, prie from price_tracker where product_id=1 limit 1;
# If price is not equal to new_price, I insert
insert into price_tracker (product_id, date, type, price) VALUES ( 1, dateof(now()), 'A', **new_price**);

但是我想询问是否有人知道如何进行插入,只有在值不同的情况下才会进行,而无需以编程方式进行检查。

非常感谢。

2 个答案:

答案 0 :(得分:1)

不,你不能以100%的正确性做到这一点。存在像IF NOT EXISTS这样的工具用于一致性,BEGIN BATCH用于原子性,但它们不能一起使用。

您必须选择失败的首选方式,然后以编程方式最好地尝试回滚等任何错误。

答案 1 :(得分:1)

问题是C *不支持原生这种访问模式,因为这意味着锁定记录。您必须手动发出读取,使用您的值执行某些操作,然后发出写入。如果另一个客户端执行相同的特定操作,那么您将遇到并发问题。 C *计数器存在同样的问题,您可以在其中递增/递减计数器,但是在没有读取计数器的情况下,您无法在更新之前/之后获取其值,并且您已阅读的内容已经存在过时了。

我有一个类似的用例,我决定使用Guava缓存缓存事物并在应用程序级别执行 locks 以避免发出 读取请求。

另请注意,如果您有行,则可以激活YAML配置文件中的row cache,C *将为您缓存整行,因此您的读取< / em>查询将从内存中提供,从不(嗯......取决于您的数据集大小)到达磁盘。

另一种方法可能是尝试利用Cassandra built-in SSTable compression(默认情况下应该已启用):对于您在该表中管理的数据类型,您可能会从总是受益写作而不是&#34;读写如果&#34;做法。这取决于插入的频率......