2016-08-30 4 views
0

Ich versuche, ein Design zu schaffen, in der mehr C++ Dienste Zähler in einer Datenbank, so etwas wie unten halten:Zähler Design in Cassandra

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

Ich denke Cassandra zu verwenden, aber ich bin nicht sicher, ob Cassandra kann unterstützen die folgende Operation in einer atomaren Weise Gleichzeitigkeit der mehreren Service-Instanzen zu unterstützen:

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

I Cassandra Zähler gesehen haben (https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html) aber es scheint, dass es nicht die LESE-Operation unterstützen kann - es ist nur stellt sicher, dass Sie den Zähler um einen bestimmten Wert erhöhen können (ohne den vorherigen Status zu kennen).

Gibt es einen Weg für Cassandra? Sollte ich eine andere Datenbank wählen, die das oben genannte unterstützt? Soll ich Cassandra benutzen und die Counter in einem Redis-Speicher behalten und Cassandra in einem zweiten Schritt aktualisieren?

Antwort

0

Es ist möglich, die Zähler zu lesen. Sie können den alten Wert nicht abrufen, während Sie den Zähler aktualisieren.

Eine andere Sache, die Sie nicht tun können, ist die gleiche Tabelle Zähler Spalten und nicht-Zähler Spalten (wenn es nicht Teil des Primärschlüssels ist).

Alle Nicht-Zähler Spalten in der Tabelle als Teil des Primärschlüssels

In Ihrem Beispiel definiert werden müssen, counter_value, threshold_value und status können in der gleichen Tabelle nicht sein. Sie müssen sie in zwei Tabellen versenden: eine mit counter_value die andere mit threshold_value und status und beide Tabellen haben den gleichen Primärschlüssel: url_name.

+0

Danke für die Antwort. Gibt es eine Problemumgehung, um den alten Wert während der Aktualisierung des Leistungsindikators zu lesen? Oder sollte ich einen zusätzlichen Mechanismus außerhalb von Cassandra verwenden (wie die gleichen Zähler in Redis zu halten)? Ihr Vorschlag, die Tabelle in zwei Teile aufzuteilen, ist gültig. – gliatsos