2016-08-30 97 views
0

我想創建一個設計,其中多個C++服務將保持計數器在數據庫中,類似如下:計數器設計卡桑德拉

CREATE TABLE page_view_counts 
    (url_name varchar, 
    counter_value counter, 
    threshold_value int, 
    status int, 
    PRIMARY_KEY (url_name) 
    ); 

我想使用Cassandra的,但我不知道,如果卡桑德拉能支持以下操作以原子的方式支持多個服務實例的併發:

READ counter_value 
IF counter_value > threshold_value 
    SET status = 1 (BLOCKED) 
ELSE 
    SET counter_value++ 

我見過卡桑德拉計數器(https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html) ,但它似乎不能支持讀操作 - 它只是確保您可以增加計數器的某個值(不知道以前的狀態)。

卡桑德拉有什麼辦法嗎?我應該去選擇一個可以支持上述的數據庫嗎?我應該使用Cassandra並將計數器保存在Redis內存中,並在第二步中更新Cassandra?

回答

0

可以讀取計數器。你不能做的是在更新計數器時檢索舊值。

你不能做的另一件事是放置在同一個表計數器列和非計數器列(如果它不是主鍵的一部分)。

表中的所有非櫃檯列必須被定義作爲主鍵

的一部分,在你的榜樣,counter_valuethreshold_valuestatus不能在同一個表。您必須將它們分配到兩個表中:一個與counter_value另一個與threshold_valuestatus並且兩個表具有相同的主鍵:url_name

+0

感謝您的回覆。更新計數器時是否有任何解決方法來讀取舊值?還是應該在Cassandra之外使用一些額外的機制(如在Redis中保留相同的計數器)?你將表分成兩份的建議是有效的。 – gliatsos