sql >> データベース >  >> RDS >> Mysql

MySQLデータベースから作成されたオブジェクトをキャッシュする方法

    考慮すべきことはたくさんありますが、一般的には、 RowDataGatewayに基づいてリレーショナルマッピングを行います。 パターン(RDG)。異なるオブジェクトタイプがあまり多くない場合、アーキテクチャへのこのアプローチは十分に拡張できるはずです。キャッシュの簿記をFinderクラスに制限する場合、RDGはキャッシュの実装を容易にする必要があります。

    時間と意志がある場合は、MartinFowlerの Patterns of EnterpriseApplicationArchitectureをご覧ください。 。良い情報です。

    具体的には...

    • ある種のIDでデータを識別します

    通常、これにはデータベースで自動インクリメントされた整数列を使用します。 unordered_mapを使用して、これらのオブジェクトをキャッシュからすばやくプルできます。キャッシュにはすべてのオブジェクトがあるため、最適化のために、find*の一部を実装することもできます。 最初にキャッシュを検索する関数。検索時間が非常に制限されている場合は、unordered_map / unordered_multimapを使用してデータの一部に「インデックスを付ける」か、古き良きマップ/マルチマップに固執することができます。ただし、これにより作業が2倍になり、これらの種類のクエリがデータベースに無料ですでに存在します。

    • キャッシュされたデータ/オブジェクトを編集する

    ダーティデータは、実際にデータベースに書き込むまで、システムの他の部分に表示されないようにする必要があります。更新を開始し、すべてが意図したとおりに進んだら、キャッシュ内のオブジェクトを更新に使用したオブジェクトに置き換えるか、単にキャッシュ内のオブジェクトを削除して、他のリーダーにデータベースから取得させることができます(これにより、オブジェクトを再度キャッシュする場合)。これは、元のGatewayオブジェクトのクローンを作成することで実装できますが、最終的には、いくつかのロック戦略を実装する必要があります。

    • 古いデータ/オブジェクトを削除し、新しいデータ/オブジェクトを追加します

    ここでは、単にオブジェクトをキャッシュから削除し、データベースから削除しようとします。データベースで削除が失敗した場合、他のリーダーがそれをキャッシュします。削除の処理中は、クライアントが同じレコードにアクセスできないことを確認してください。新しいレコードを追加するときは、Gatewayオブジェクトをインスタンス化し、それをドメインレベルのオブジェクトに渡し、変更が完了したら、Gatewayオブジェクトでinsertを呼び出します。新しいGatewayオブジェクトをキャッシュに配置するか、最初のリーダーにキャッシュに配置させることができます。

    • ある種の優先度(最後に使用された)でデータを並べ替える
    • 提供された情報に基づいてデータ/オブジェクトをキャッシュするための最良の方法とその理由は何ですか?

    これは、最適なキャッシュアルゴリズムを選択することです。 これは答えるのが簡単な質問ではありませんが、LRUは問題なく機能するはずです。実際のメトリックがなければ、正しい答えはありませんが、LRUは簡単に実装でき、要件に合わない場合は、メトリックを実行して新しいアルゴリズムを決定するだけです。キャッシュへの優れたインターフェースを使用して、シームレスにそれを実行できることを確認してください。もう1つ覚えておくべきことは、ドメインレベルのオブジェクトがキャッシュの制限に依存してはならないということです。 100kのオブジェクトが必要で、キャッシュが50kしかない場合でも、メモリには100kのオブジェクトがすべて残っていますが、そのうちの50kはキャッシュにあります。つまり、オブジェクトはキャッシュの状態に依存してはならず、キャッシュがあるかどうかも気にしないでください。

    次に、RDGのアイデアをまだ使用していない場合は、Gatewayオブジェクトをキャッシュにキャッシュしているだけです。 shared_ptrを使用して、Gatewayオブジェクトのインスタンスをキャッシュに保持できますが、ダーティな書き込みを回避したい場合は、ロック戦略(楽観的vs悲観的)も考慮する必要があります。また、すべてのゲートウェイ(テーブルごとに1つ)は同じインターフェイスを継承できるため、保存/読み込み戦略を一般化できます。また、物事をシンプルに保ちながら単一のプールを使用できます。 ( boost::poolをチェックしてください。 たぶんそれはキャッシュの実装に役立つでしょう。)

    最後のポイント:

    ケーキは嘘です! :D何をするにしても、それが適切な量のパフォーマンスメトリックに基づいていることを確認してください。パフォーマンスを20%向上させ、それを2か月間行った場合は、ハードウェアにRAMをもう少し追加することを検討する価値があります。簡単に検証できる概念実証を作成します。これにより、キャッシュの実装が成功するかどうかについて十分な情報が得られます。そうでない場合は、テスト済みで信頼性の高いソリューションをいくつか試してみてください(memcachedなど、@ Layneはすでにコメントしています)。




    1. MySQL InnoDB Cluster 8.0-完全な操作のウォークスルー:パート2

    2. SQL Serverでselectクエリを使用してテーブルを作成するにはどうすればよいですか?

    3. MySQLのテーブルから単一の行を結合します

    4. 一部のキーがMySQLWorkbenchforMacで正しく機能しない