2009-07-30 12 views
0

私のアプリケーションは、約から(連絡先情報を示し形成する様々な詳細情報(名前、電話番号など)と2000の連絡先レコード。接触グリッドの基部)を含む。ASP.NET C#:(につきレコード基づいて)場合は/どのように無効化、データベースの結果をキャッシュ

ユーザーのかなりの数は、しかし、この情報を編集する権限を持っている、そしてそれが編集された場合、変更がみんなにすぐに表示されていることが必要です。私は、データベースから誰もが日が起こって任意の変更なしで行くかもしれない、特にため、この情報を閲覧するたびに、この情報を再フェッチ制限したいと思います。同時に

私はリスト全体に微小な変更が行われるたびに再フェッチができ、それはどちらか正しい方法を思えません。だから、私はすべてをキャッシュする方法を探しています。&は、他のすべてのものをキャッシュしたままで変更された部分(たとえば、1レコード)のみを再フェッチします。このページは、主にキャッシュをフィード・オフし、それを表示するたびにデータを取得することが例外になります。

は、どのように私は賢明なこのデザイン&コードについては行くだろうか?あなたの助けは非常に高く評価されます。

+0

あなたがコントロールする方法で編集しますか? (つまり、キャッシュを無効にできるアプリですか?) –

+0

はい、これは私のWebアプリケーション内にあります。 – Alex

答えて

3

、あなたのキャッシュエントリを置き換える必要があり、その後、データベースに

を書き、私はそれをこのようにしないだろう。同時更新が複数ある場合は、データベースの更新と同じ順序でキャッシュの置換が行われているかどうかはわかりません(キャッシュ更新は、データベースの更新と同じトランザクションの一部である場合を除きます)。

代わりに私が希望:主キーから導出されるキャッシュキーとキャッシュ内

  • ストアのアイテムを。

  • 各更新操作では、データベースの更新後にキャッシュエントリを削除するだけです。このようにして、次回のアクセス時に最新のデータでキャッシュがリフレッシュされます。

0

各挿入操作および編集操作では、キャッシュエントリを置き換えてデータベースに書き込む必要があります。 dbに編集を送信する前に、エントリが無効化されていない(つまり、読み込みが不正です)ことを確認して、データが失われることを確認する必要があります。

実際にデータの完全性が懸念される場合は、キャッシュのトランザクションログ&データベース操作を保存して、停止時に何が進行中であるかを知ることができます。

0

すべてのアップデートのタイムスタンプを保持する必要があるようです。すべてのレコードにはタイムスタンプが関連付けられています。

最初のアプリケーション負荷はすべてのレコードを取得し、アプリケーションは最大タイムスタンプを記録します。

変更が保存されるたびに、レコードのタイムスタンプが更新されます。次に、他のユーザーが変更をロードする必要がある場合は、クライアントの最後に知られた最大タイムスタンプの後に更新されたものを尋ねることができます。他のユーザーは変更のみを取得します。

0

MS Enterprise Library Caching Blockには、時間ベースおよび通知ベースの無効化(データストアから発生した無効化を含む)に基づいてキャッシュの依存関係と無効化を設定できる優れた機能があります。確認してください

0

私たちはEnterprise Library Cachingブロックを使用してこれを行っています。しかし、Abhijeet Patelが述べたように、バッキングストアを使用せずに使用します。

キャッシュは、キーと値のペアとして構成されています。

ユーザーは、それがキャッシュ内にある場合、キャッシュからの戻りそうならば、データベースから取得し、キャッシュを更新する一切場合、我々は、チェックしないレコードを取得しようとします。

ユーザーが行を変更すると、データベースが更新されるのと同時にキャッシュが更新されます。

これは、データの更新方法を制御している場合に機能することに注意してください。また、キャッシュが複数のサーバーに格納されている場合は、もう少し作業を行う必要があります。各挿入および編集操作で

+0

"データベースが更新されるのと同時にキャッシュを更新します。" - 私の答えに記載されているように、データベースが更新された後*単にキャッシュから削除する方が良いです。 – Joe

関連する問題