我需要以一定的时间间隔将数据从我的系统转发到外部系统。为此,我已经将所有行存储在一个表中。不应再次导出已转发的数据。
这个想法是在客户端记住上次导出时间,并在下次导出以下记录。成功导出后,将删除旧行。
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'
- 有没有人已经实现了类似的,或者你有不同的溶液?
- 如果可能,我不需要请求的 id,因为我想 导出所有数据
如果使用固定分区键值 (id = 1(,则所有插入、选择和删除将在同一节点上一遍又一遍地发生(如果 RF=1(。并且对于每次删除 cassandra 创建一个逻辑删除条目,当你执行选择查询时,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
中提取的小时,日,月,年的值
选择数据时需要注意两种情况:
- 以前的导出时间和当前导出时间都在同一小时。
- 两个时间不在同一小时内。
一,您只需要一个查询,对于情况二,您必须执行两个查询。
示例查询:
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';