1

特定の情報を membase にロールアップして、高価なグループによるクエリを回避したいアプリケーションがあります。たとえば、クリック コンバージョンが MySQL に記録され、特定のユーザーの時間ごとにグループ化された現在のクリック数の合計を memcache キーに保持したいとします。そこで、必要な値で配列をアン/シリアル化できます。収益、いいねなど、他にもこのようなニーズがたくさんあります。

MC と Mysql が同期していることを保証する何らかの「トランザクション」を作成する最良の方法は何でしょうか? 基礎となる MySQL ストアに基づいていつでもキー ストアを再構築できますが、2 つの製品間で良好な同時実行性を維持したいと考えています。

4

1 に答える 1

0

大まかに言うと、membase / memcache / などを mysql のキャッシュとして使用するには、次のようにする必要があります。

public Object readMethod(String key) {
    value = membaseDriver->get(key);
    if(value != null) {
        return value;
    }
    value = getFromMysql(key);
    membaseDriver->put(key, value, TTL);
}

public Object writeMethod(String key, String value) {
    writeToMysql(key, value);
    membaseDriver->delete(key); 
    //next call to get will get the value that we just wrote to db
}

これにより、DB がデータのプライマリ ソースであり続け、membase と mysql がほぼ同期した状態に保たれます。(プロセスが書き込みメソッドを実行している間、mysql に書き込んだ後、membase からキーを削除する前は同期していません)。

それらを本当に同期させたい場合は、プロセスが writeMethod を実行している間は、どのプロセスも readMethod を実行できないようにする必要があります。add メソッドを使用して、memcache / membase で単純なグローバル ロックを実行できます。基本的に、ロックにちなんで名付けられた一意のキー (例: "MY_LOCK") を追加します。追加が成功すると、ロックが取得されます。これが発生すると、他の誰もロックを取得できなくなります。書き込みが完了したら、ロックのキー名で delete を呼び出してロックを解除します。その「ロック」でこれらのメソッドの両方を開始し、「ロック解除」でこれらのメソッドの両方を終了することにより、一度に 1 つのプロセスのみがいずれかを実行するようにします。その上に個別の読み取りロックと書き込みロックを構築することもできますが、私はしません。

1 時間あたりのクリック数の場合、現在の時間 (つまり、変更される唯一の時間) を以前のすべての時間の配列 (おそらく変わらないですよね?)

クリックを追加するたびに、現在の時間のカウンターで memcache の増分を使用するだけです。次に、読み取り要求を受け取ったら、前のすべての時間の配列、次に現在の時間、および最後に現在の時間が追加された過去のすべての時間の配列を検索します。無料ボーナスとして、インクリメントがアトミックであるという事実により、実際に同期された値が提供されるため、ロックをスキップできます。

于 2012-05-10T19:45:54.047 に答える