Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 是否可以根据最后一条记录插入一条记录?_Cassandra_Nosql - Fatal编程技术网

Cassandra 是否可以根据最后一条记录插入一条记录?

Cassandra 是否可以根据最后一条记录插入一条记录?,cassandra,nosql,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); 只是我碰巧搜索了该产

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

这是表的定义:

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**);
但是我想问一下,是否有人知道进行插入的任何方法,并且只在值不同时才进行插入,而不进行编程检查


非常感谢。

不,您不能100%正确地完成此操作。有一些工具,如用于一致性的
IF NOT exists
,以及用于原子性的
BEGIN BATCH
,但它们不能一起使用


您必须选择首选的失败方式,然后在出现任何错误时,以编程方式进行最佳回滚等操作。

不,您不能100%正确地执行此操作。有一些工具,如用于一致性的
IF NOT exists
,以及用于原子性的
BEGIN BATCH
,但它们不能一起使用


您必须选择首选的失败方式,然后以编程方式对任何错误进行最佳回滚等操作。

问题是C*本机不支持这种访问模式,因为这意味着锁定记录。您必须手动发出读取,使用您的值执行某些操作,然后发出写入。如果另一个客户机执行相同的特定操作,则会出现并发问题。C*计数器也存在同样的问题,您可以递增/递减计数器,但在更新之前/之后,如果不读取计数器,则无法获取其值,并且读取的内容可能已经过时

我有一个类似的用例,我决定使用缓存在应用程序级缓存东西并执行锁,以避免发出 阅读请求

还请注意,如果您有热行,您可以激活YAML配置文件中的,并且C*将为您缓存整个行,因此您的读取查询将从内存中提供,并且永远不会(嗯……取决于您的数据集大小)到达磁盘


另一种方法可能是尝试利用(默认情况下应该已经启用):对于您在该表中管理的数据类型,您可能会受益于总是写入而不是“读写如果”方法。这取决于插入的频率…

问题是C*本机不支持这种访问模式,因为这意味着锁定记录。您必须手动发出读取,使用您的值执行某些操作,然后发出写入。如果另一个客户机执行相同的特定操作,则会出现并发问题。C*计数器也存在同样的问题,您可以递增/递减计数器,但在更新之前/之后,如果不读取计数器,则无法获取其值,并且读取的内容可能已经过时

我有一个类似的用例,我决定使用缓存在应用程序级缓存东西并执行锁,以避免发出 阅读请求

还请注意,如果您有热行,您可以激活YAML配置文件中的,并且C*将为您缓存整个行,因此您的读取查询将从内存中提供,并且永远不会(嗯……取决于您的数据集大小)到达磁盘

另一种方法可能是尝试利用(默认情况下应该已经启用):对于您在该表中管理的数据类型,您可能会受益于总是写入而不是“读写如果”方法。这取决于插入的频率