2017-05-14 39 views
0

我正想通過這個Instagram engineering article凡在他們關於非規範化櫃檯提到,我引用卡桑德拉 - 使計數器更新和正常更新原子

要降低這些操作的資源,我們非規範化計數器喜歡這篇文章。每當有新的進來時,數據庫中的計數就會增加。因此,計數的每次讀取只是一個簡單的「選擇」,這是一個更有效的方法。

也有在其中類似器到後存儲在同一個數據庫 櫃檯反規範化的一個額外的好處。這兩個更新可以包含在一個事務 ,使得更新原子和一致 所有的時間。而改變之前,在高速緩存中的計數器可以 什麼是存儲在數據庫中,由於超時不一致, 重試等

我試圖更新計數器表和普通表其中有用戶誰喜歡在使用批處理後,

BEGIN BATCH 
    UPDATE postlike_counter_counter 
    set likecount = likecount+1 
    where postid = c77b9e44-379b-11e7-93dc-dd4982fae088; 
    INSERT INTO postlikes (postid, likedtime, likedby) values(c77b9e44-379b-11e7-93dc-dd4982fae088, unixTimestampOf(now()), 
    {"firstname": 'fname', "lastname": 'lname', "profileimgurl":'img/pic'}); 
APPLY BATCH; 

我看到錯誤,計數器突變只允許在反批 如果我做它作爲一個反批,我得到的,COUNTER批次只允許計數器突變

有沒有什麼辦法可以使這項工作?如果不是的話,那麼當他們寫出上面引用的行時,這篇文章究竟意味着什麼?

回答

1

Ashraful伊斯蘭教回答了這個問題,爲什麼卡桑德拉不允許混合櫃檯查詢和非計數器查詢在一個批次中。但是,你所引述上下文沒有在卡桑德拉世界發生。 Instagram engineering article (De-normalizing Counters)正試圖在PgQ世界進行解釋(實際上,它們也可能不是計數器數據類型,但是作爲某種計數器來維護)

0

計數器更新和正常的更新不能在同一批次中使用。

計數器批次不能在DML語句中包含非計數器列,就像非計數器批次不能包含計數器列一樣。計數器批處理語句不能提供自定義時間戳。

你必須使用單獨的批處理。

首先,你可以應用反批,如果成功則適用非櫃檯批次。如果非計數器批次失敗,則切換計數器語句的符號(set a = a + 1 to a = a - 1或反之)並應用批次。

在Java這裏是你如何檢查批次是wasApplied()方法成功

ResultSet resultSet = session.execute(batch); 

if(resultSet.wasApplied()) { 
    // Batch success 
} 

來源:https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlBatch.html

+0

這篇文章在他們說使用原子事務時究竟意味着什麼。上述解決方案似乎不是原子的? – gameOne