2

シンプルな注文サービスがあり、キャッシュを実装したいと考えています。これが私のリクエスト/レスポンスとサービスです:

[Route("/order", "GET")]
[Route("/order/{Id}", "GET")]
public class OrderRequest : IReturn<OrderResponse>
{
    public int Id { get; set; }

    public string Reference1 { get; set; }

    public string Reference2 { get; set; }

    public DateRange CreatedOn { get; set; }

    public DateRange ProcessedOn { get; set; }

    public DateRange ShippedOn { get; set; }

    public DateRange ModifiedOn { get; set; }
}

public class OrderResponse : IHasResponseStatus 
{
    public ResponseStatus ResponseStatus { get; set; }

    public List<Order> Orders { get; set; }
}

public class OrdersService : Service
{
    public object Get(OrderRequest request)
    {
        var cacheKey = UrnId.Create<OrderResponse>(request.Id.ToString());
        return base.RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, new TimeSpan(0,5,0), () =>
        {
            return GetOrders(request);
        });
    }

    public OrderResponse GetOrders(OrderRequest request)
    {
        ..
    }
}

ドキュメントを見ると、キャッシュされたアイテムごとに一意のキーが生成されます。例では、これは通常、応答オブジェクト + アイテム ID です。ただし、さまざまなタイプのリクエストをキャッシュしたいと思います。たとえば、リクエストで日付範囲を指定できます。同じ日付範囲で同じリクエストを行うと、キャッシュされたコピーを受け取りたいと思います。私の質問は、一部またはすべてのリクエスト パラメータに基づいて一意の ID を生成する最良の方法は何ですか? おそらく、リクエスト DTO で GetHashCode を使用またはオーバーライドしますか? 次に、キャッシュに同じタイプ (OrderResponse など) のオブジェクトが多数含まれている場合、特定のタイプのアイテムをすべて削除できますか? そうしないと、注文を変更すると、キャッシュされたオブジェクトのどれを削除すればよいかわかりません。

4

1 に答える 1

1

cacheKey について特別なことや重要なことは何もありません。キャッシュするアイテムまたは結果セットごとに一意である必要があります。

指定された日付範囲に対して異なるキャッシュをサポートする場合は、変数情報をキーに追加する必要があります。Request DTO で一意のプロパティの組み合わせを使用するか、適切な場合はbase.Request.PathInfoおよび/または QueryString を使用して、キャッシュ キーとして使用する一意の文字列を作成できます。

次に、キャッシュに同じタイプ (OrderResponse など) のオブジェクトが多数含まれている場合、特定のタイプのアイテムをすべて削除できますか?

いいえ、各CacheProviderは何がキャッシュされているかを認識しません。キャッシュの無効化ロジックはクライアント アプリケーションが管理します。

そうしないと、注文を変更すると、キャッシュされたオブジェクトのどれを削除すればよいかわかりません。

その場合、有効期限を設定して有効期限が切れるようにするか、基盤となるキャッシュ プロバイダーの高度な機能を使用する必要があります (サポートされている場合)。MemoryCacheClientたとえば、ワイルドカード API をサポートしている場合:

 cache.RemoveByPattern("cache:Orders:*");
 cache.RemoveByRegex("cache:Orders:.*);

そのため、同じプレフィックスを使用してキーを階層構造にすると、関連するすべてのキャッシュを 1 つのワイルドカード コマンドで無効にすることができます。

于 2013-01-29T05:42:27.290 に答える