我需要以一定的时间间隔将数据从我的系统转发到外部系统。为此,我已将所有行存储在表中。已转发的数据不应再次导出。
这个想法是记住客户端的最后一次导出时间,并在下次导出以下记录。导出成功后将删除旧行。
CREATE TABLE export(
id int,
import_date_time timestamp,
data text,
PRIMARY KEY (id, import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC)
insert into export(id, import_date_time, data) values (1, toUnixTimestamp(now()), 'content')
select * from export where id = 1 and import_date_time > '2017-03-30 16:22:37'
delete from export where id = 1 and import_date_time <= '2017-03-30 16:22:37'
答案 0 :(得分:1)
如果使用固定分区键值(id = 1),则所有插入,选择和删除都将在同一节点(如果RF = 1)上反复进行。并且还为每个删除cassandra创建一个逻辑删除条目,当您执行select查询时,cassandra需要合并每个条目。因此,您的选择查询性能将降低。
因此,不要使用固定值,而是使用动态值,如下所示:
CREATE TABLE export(
hour int,
day int,
month int,
year int,
import_date_time timestamp,
data text,
PRIMARY KEY ((hour, day, month, year), import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC);
您可以在此处插入从import_date_time
选择数据时需要注意两种情况:
对于案例1,您只需要一个查询,对于案例2,您必须执行两个查询。
示例查询:
SELECT * FROM export WHERE hour = 16 AND day = 30 AND month = 3 AND year = 2017 AND import_date_time > '2017-03-30 16:22:37';