2016-08-30 2 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++ 

Я видел Cassandra счетчика (https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html) но мне кажется, что он не может поддерживать операцию READ - это просто гарантирует, что вы можете увеличить счетчик на некоторое значение (не зная предыдущего состояния).

Есть ли какой-либо способ для Кассандры? Должен ли я пойти на другой выбор базы данных, который может поддержать выше? Должен ли я использовать Cassandra и сохранять счетчики в памяти Redis и обновлять Cassandra на втором этапе?

ответ

0

Можно считывать счетчики. То, что вы не можете сделать, это получить старое значение при обновлении счетчика.

Еще одна вещь, которую вы не можете сделать, - это разместить столбцы счетчиков столбцов и столбцы без встречных (если это не часть первичного ключа).

Все без счетчика столбцов в таблице должны быть определены как часть первичного ключа

В вашем примере, counter_value, threshold_value и status не может быть в той же таблице. Вы должны отправить их в две таблицы: один с counter_value другой с threshold_value и status, и обе таблицы имеют тот же первичный ключ: url_name.

+0

Спасибо за ответ. Существует ли какое-либо обходное решение для чтения старого значения при обновлении счетчика? Или я должен использовать какой-то дополнительный механизм за пределами Кассандры (например, держать такие же счетчики в Redis)? Ваше предложение о разделении таблицы на две имеет силу. – gliatsos

Смежные вопросы