2

SQLサーバーテーブルから読み取られたメッセージの一種のキューを表示する「動的バナー」からメソッドが呼び出されるWebサービスを開発しています。

バナーは、トラフィックの多いサイトのホームページでは大きなプレッシャーになります。バナーが読み込まれるたびに、メッセージの新しいキューを取得するために Web サービスが呼び出されます。

現在: バナーが読み込まれるたびに、このすべてのトラフィックによってデータベースへのクエリが実行されるのは望ましくないため、asp.net キャッシュ (つまり、HttpRuntime.Cache[cacheKey]) を使用してデータベース アクセスを制限することを考えています。1 分ごとにキャッシュを更新するようにします。

明らかに、トラフィックを制限するために、メッセージをできるだけ少なくしようとします。

しかし、そのようなシナリオに対処する他の方法があるかもしれません。たとえば、キュ​​ーの最新バージョンをファイル システムに書き込み、Web サービスにそのファイルにアクセスさせることができます。または2つのアプローチを混合する何か...

解決策は、C# Web サービス、asp.net 3.5、SQL Server 2000 です。

ヒントはありますか?他のアプローチ?

ありがとう

アンドレア

4

7 に答える 7

4

それは多くのことに依存します:

  • データにほとんど変更がない場合 (「公開」ボタンまたは毎日のバッチを使用したバックエンドを考えてください)、私は間違いなく静的ファイルを使用します (バックエンドからのプッシュによって更新されます)。このソリューションをいくつかの大規模なサイトで使用したところ、非常にうまく機能しました。
  • データが十分に小さい場合、メモリ キャッシング (つまり Http キャッシュ) は実行可能ですが、ロックの問題に注意し、また、フレームワークがメモリを必要とする場合に項目が早期に期限切れになる可能性があるため、重いメモリ負荷の下では Http キャッシュがうまく機能しないことに注意してください。以前噛まれたことがあります!上記の注意事項により、HTTP キャッシュは非常にうまく機能します。
于 2008-09-16T12:10:15.180 に答える
2

キャッシュは合理的なアプローチであり、さらに一歩進んで SQL 依存関係を追加できると思います。

ASP.NET キャッシュ: SQL Server 2000 での SQL キャッシュの依存関係

于 2008-09-16T11:03:42.080 に答える
1

ファイルを書き込むことは、IMHO のより良い解決策です。IIS カーネル コードによって提供され、asp.net の巨大なオーバーヘッドがなく、後でファイルを CDN にコピーできます。

私の知る限り、依存関係のキャッシュは、SQL Server 2000 ではあまり効率的ではありません。

于 2008-09-16T11:35:55.183 に答える
1

ファイル ルートを使用する場合は、この点に注意してください。

http://petesbloggerama.blogspot.com/2008/02/aspnet-writing-files-vs-application.html

于 2008-09-16T11:41:29.290 に答える
0

また、Skliwzが言及したメモリ制限を回避する1つの方法は、通常のアプリケーションの外部でこのサービスを使用している場合、それを独自のアプリプールに分離できることです。私はこれが以前に行われたのを見たことがありますが、これも役立ちます。

于 2008-09-16T21:48:54.790 に答える
0

データのサイズは小さいですが、基になるテーブルは変更されるため、HttpCache の方法を使用すると思います。実際には、データが変更されている場合でも、db アクセスを減らす方法が必要です (それが理由です)。 @Bloodhound で提案されているように、直接の Sql 依存関係を使用しないようにします)。

公開する前に、ストレステストを行うと思います。

ありがとうございました。

于 2008-09-17T08:43:29.910 に答える
0

もちろん、SixPack ライブラリのキャッシュ機能も使用できます (使用する必要があります) 。

  • クラスに属性を設定することで機能する、HttpCache に基づくフォワード (通常) キャッシュ。最も簡単に使用できますが、場合によっては、コンテンツが実際にデータベースから取得されるまで待つ必要があります。
  • キャッシュを最初からプリフェッチします。これは、最初の呼び出しの後、舞台裏でキャッシュの更新を開始し、場合によっては待機せずにコンテンツを取得できることが保証されます。

詳細については、SixPack ライブラリのホームページを参照してください。コード (特にフォワード キャッシュ) は負荷テスト済みであることに注意してください。

単純なキャッシュの例を次に示します。

    [Cached]
    public class MyTime : ContextBoundObject
    {
            [CachedMethod(1)]
            public DateTime Get()
            {
                    Console.WriteLine("Get invoked.");
                    return DateTime.Now;
            }
    }
于 2009-01-01T09:56:31.747 に答える