3

ニュース項目の大きなリストを取得しています。

明らかな理由から、このリストのキャッシュを利用したいと考えています (必要以上にクエリを実行することはできません)。

このリストを、ページングを有効にするために拡張したリピーターにバインドします (ページ間をフリックするとページが読み込まれ、リストが再度取得されます)。

複雑なのは、ニュース項目を日付で照会する場合にのみ存在するクエリ文字列「年」から、これらのニュース項目を日付で照会することもできるという事実です。

以下は、これまでの疑似コードです (実際のコードをここに貼り付けると、混乱を招くだけのすべてのビットを削除するのに時間がかかりすぎます)。

if(complete news items list are not cached OR querystring["year"] != null)
{
   Int year = queryString["year"] (could be null)
   Cache.Add(GetNewsItems(year));
}
else
{
   return cached newsItems;
}

問題は、(ページング コントロールのポストバックが原因で) ニュース アイテム ページが読み込まれるときに、クエリ文字列の [年] パラメータがまだ設定されているため、GetNewsItems が再実行されることです。また、ホーム URL (つまり、クエリ文字列なし) に移動した場合でも、事実上、ニュース アイテムのキャッシュ バージョンが存在するため、わざわざそれらを取得しようとすることはありませんが、特定の年にはそこに存在する場合があります (MAY)。したがって、「すべての年」の種類の検索には関係ありません。

最近行った検索にフラグを付けるために、新しいキャッシュ エントリを追加する必要がありますか? キャッシュのタイムアウトを発生させるために、ここでどのような考慮事項を行う必要がありますか? 必要に応じて新しいクエリ文字列を追加できます (できれば追加しないでください) - これで問題は解決しますか?

4

2 に答える 2

2

最初のクエリで完全なリストを取得し、これをキャッシュできますか(それほど大きくないと仮定して)?次に、後続のクエリでキャッシュからデータを取得し、クエリを実行して、必要な年だけを除外します。

たぶん、あなたは次の形式でデータをキャッシュに保存することができます

IDictionary<int, IEnumerable<NewsItem>> 

(1年に複数のNewsItemがあると仮定します)ここで、キーは年であるため、1つのディクショナリ値ペアを取得するだけで1年のデータを取得できます。

または、サンプルで行っているように、年ごとにデータをキャッシュし、データが存在する場合は、各年のキャッシュからデータを取得するメカニズムを実装します。すべてを取得するときは、データストアからすべてを取得してこれを個別にキャッシュするか、キャッシュから欠落している年を特定してこれらを取得するメカニズムを実装することができます。個人的には、キャッシュされたデータが多すぎてメモリが詰まらないように、すべてをキャッシュし、キャッシュからデータをフィルタリングすることを検討します。

キャッシュから取得するのに便利なTryGetValueパターンは次のようなものです。

private bool TryGetValue<U>(string key, out U value)
    {
        object cachedValue = HttpContext.Current.Cache.Get(key);
        if (cachedValue == null)
        {
            value = default(U);
            return false;
        }
        else
        {
            try
            {
                value = (U)cachedValue;
                return true;
            }
            catch
            {
                value = default(U);
                return false;
            }
        }
    }
于 2012-06-21T13:22:17.567 に答える
1

これがあなたのケースに役立つかどうかはわかりませんが、ユーザー コントロールにリピーターを追加し、それに対して OutputCache を有効にして、POST/GET パラメータによって無効にすることができます。

<%@ OutputCache Duration="100" VaryByParam="year" %>
于 2012-06-21T12:55:50.840 に答える