自動遞增ID在Cassandra或任何其他分佈式數據庫中並不真正有效。
爲什麼?假設你有三個節點。兩個節點同時獲得對同一個表的寫入請求。一個檢查表的最大ID,並得到一個(示例)響應2544.在可以寫入新行之前,另一個節點執行相同的過程,並獲得2544.現在,您有兩行被插入2545,在卡桑德拉,最後的寫作「勝利」,所以你會失去第一次寫作。
因此,這也是爲什麼先前讀寫方法被認爲是Cassandra中的反模式。正如Stefan所建議的那樣,TimeUUID提供瞭解決這個問題的方法。
在卡桑德拉你需要設計你的表來適應你的查詢模式。我聽到的是,你想要找回最近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條記錄,那一天。注意:如果「日」對您的解決方案來說太細緻(只有少數員工記錄每天都會更新),請隨時將其擴大到更適用的範圍。
UPDATE:
如果我想以前的最新的100的記錄是801到900
這種解決方案實際上確實有辦法通過的結果, 「頁」。
讓我們插入一些行到表:
> 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)
正如我在降序排列都聚集在record_id
此表,我可以簡單地通過查詢record_id
來獲得接下來的3條記錄,比我讀的最後一條還要少。在這種情況下,這會是23b0dc60-e5db-11e5-a4ba-a52893cc9f36
:
> 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)
謝謝@Aaron,我得到了你的觀點,如果我想以前的最新的100條記錄什麼。 (就像我有1000條記錄,現在我得到了最新的100條記錄,因爲你說的是901到1000,如果我想要以前的最新的100條記錄是801到900),我想爲每個請求分配100條記錄,任何人都可以請建議根據我的要求查詢... – Ankit
@Ankit編輯。 – Aaron