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*将为您缓存整个行,因此您的读取查询将从内存中提供,并且永远不会(嗯……取决于您的数据集大小)到达磁盘 另一种方法可能是尝试利用(默认情况下应该已经启用):对于您在该表中管理的数据类型,您可能会受益于总是写入而不是“读写如果”方法。这取决于插入的频率