8

基本的に、一時的なチャット メッセージをサーバー側に格納するためのデータ構造が必要です。そのはず:

  • 制限あり: あまり多くのメッセージを保存する必要がないため、クライアントは新しいメッセージを取得するためのリクエストを毎秒送信します。バインドされたサイズは最大にする必要があると思います。1 秒での同時リクエストのマウント。バッファがいっぱいになると、古いメッセージが削除されます。

  • 高い同時アクセスに適しています: Collections.synchronizedXXXX のようなデータ構造を使用したくありません。反復中に、他のスレッドがデータ構造を変更すると (メッセージを追加するなど)、例外がスローされるため、ロックする必要があるためです。データ構造全体、実際にはクライアントリクエストが最後に挿入されたメッセージを取得できるかどうかはあまり気にしません.1秒後に新しいリクエストを送信するためです. パッケージ java.util.concurrency の下のクラスが解決策のようですが...

  • 非ブロッキング: LinkedBlockingQueue、ArrayBlockingQueue これらは制限される可能性があり、反復中に例外をスローしませんが、すべてブロッキング キューです。キューがいっぱいになったら、新しい要素をテールに追加し、古い要素をヘッドでブロックするのではなくヘッドから削除し、誰かがヘッダーを削除するのを待ちます。

私の質問は、第 3 ライブラリからの適切な実装はありますか? たとえば、Googleグアバ?または、一時的なチャット メッセージをサーバーに保存することについて、より良い考えをお持ちですか?

どうもありがとうございます!

4

5 に答える 5

4

Apache Commons CircularFifoBufferを利用できます。最初と最後の基準を満たしています。同時実行をサポートするために、次のように同期バージョンでベース バッファーをラップできます。

Buffer fifo = BufferUtils.synchronizedBuffer(new CircularFifoBuffer());

プロジェクト頑張ってください。

于 2012-04-13T11:21:04.087 に答える
3

ConcurrentLinkedQueueをご覧になりましたか?ページには

この実装は、効率的な「待機なし」アルゴリズムを採用しています...

待機の自由は、あなたが得ることができる最も強力な保証の1つです。

于 2012-04-12T20:22:35.857 に答える
1

ArrayBlockingQueue条件付きステートメントで囲むことにより、ノンブロッキング動作を に追加できoffer()ます。キューがオファーを受け入れられなかった場合、ヘッドがドロップされ、オファーが再作成されます。

    public class LearnToQueue {


    public static void main(String[] args){
        Queue<Integer> FIFO = new ArrayBlockingQueue<Integer>(4);

        int i = 0;

        while ( i < 10 ){

            if (!FIFO.offer(i)){
            // You can pipe the head of the queue anywhere you want to
                FIFO.remove();
                FIFO.offer(i);
            }
            System.out.println(FIFO.toString());
            i++;

        }
    }

    }
于 2014-05-11T21:24:59.603 に答える
0

LinkedTransferQueueは、厳密な FIFO 順序付けを強制しない、ブロックする制限のないキューです。空のキューから取得する場合にのみブロックされますが、キューに追加する場合はブロックされません。サイズまたは読み取りおよび書き込みカウンターのいずれかを追加することで、要素を削除するためのソフト キャップを追加できます。

要件によっては、カスタムのロックフリー リング バッファーを作成できる場合があります。

于 2012-04-13T01:34:40.097 に答える