我有数百万条记录,现在我必须获取最新的最新记录。我想用record_id保存每条记录,我希望在插入新记录时,此record_id会自动增加。
例如:假设我有1000条记录,首先我想要最新的100条记录,从901到1000.现在在第二次请求时,我想要下一条100条最新记录从801到900.我已经经历了这么多链接但是没有找到任何相关的东西。任何人都能给出适当的解决方案吗?
我们假设表格emp包含:
姓名文本,
record_id int,
地址文本
假设name是主键,record_id是簇密钥。但请不要现在讨论主键概念,因为我的要求是创建id作为集群密钥(我正在使用cassandra 2.2.3和cql 3.3.1)。
答案 0 :(得分:2)
自动增加ID在Cassandra或任何其他分布式数据库中都不起作用。
为什么呢?让我们说你有三个节点。两个节点同时向同一个表发送写请求。一个检查表的最大ID,并获得2544的(示例)响应。在写入新行之前,另一个节点执行相同的过程,并且还获得2544.现在您有两行插入2545,在卡桑德拉,最后一次写作"胜利"所以你将失去第一次写作。
因此,这也是为什么在Cassandra中将read-before-write方法视为反模式的原因。正如Stefan建议的那样,TimeUUID解决了这个问题。
在Cassandra中,您需要设计表格以适合您的查询模式。我听到的是,您想要检索最近100名更新的员工。我会创建一个特定的表来服务:
CREATE TABLE employee_updates (
datebucket text,
record_id timeuuid,
name text,
address text,
PRIMARY KEY (datebucket,record_id))
WITH CLUSTERING ORDER BY (record_id DESC);
现在,当您在此表中查询最近100条记录时:
SELECT * FROM employee_udpates WHERE datebucket='20160309' LIMIT 100;
您可以获取该特定日期的最新100条记录。
注意:如果" day"对于您的解决方案而言过于精细(每天只有少数员工记录得到更新),然后可以将其扩展到更适用的范围。
<强>更新强>
如果我想要之前的最新100条记录是801到900
,该怎么办?
这个解决方案实际上确实有一种方法可以实现&#34; page&#34;通过结果。
让我们在您的表格中插入一些行:
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'123 main st.','Bob Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'456 Gene ave.','Bill Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'34534 Water st.','Jebediah Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'843 Rocket dr.','Valentina Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'33476 Booster way','Isabella Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'43 Solid Rocket pl.','Helcine Kerman');
现在让我选择今天最近的前3名:
> SELECT datebucket, record_id, dateof(record_id), name
FROm employee_updates WHERE datebucket='20160309' LIMIT 3;
datebucket | record_id | system.dateof(record_id) | name
------------+--------------------------------------+--------------------------+------------------
20160309 | 511f9150-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:43:02+0000 | Helcine Kerman
20160309 | 2f9f3670-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:42:06+0000 | Isabella Kerman
20160309 | 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:46+0000 | Valentina Kerman
(3 rows)
由于我已经按照DESCending顺序将此表聚集在record_id
上,因此我可以通过查询比我读到的最后一个record_id
更少的23b0dc60-e5db-11e5-a4ba-a52893cc9f36
来获得接下来的3条记录。在这种情况下,该{是> SELECT datebucket, record_id, dateof(record_id), name
FROm employee_updates WHERE datebucket='20160309'
AND record_id < 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 LIMIT 3;
datebucket | record_id | system.dateof(record_id) | name
------------+--------------------------------------+--------------------------+-----------------
20160309 | 16400100-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:23+0000 | Jebediah Kerman
20160309 | 0b239cf0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:05+0000 | Bill Kerman
20160309 | 00d648b0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:40:47+0000 | Bob Kerman
(3 rows)
:
{{1}}
答案 1 :(得分:1)
Cassandra不支持自动增量ID。但您可以使用time-based UUID代替群集密钥,以确保记录将从最旧到最近排序。