2016-03-02 120 views
1

我正在尋找緩存使用ServiceStack的昂貴的查詢。ServiceStack緩存

我的想法是如下

步驟1:高速緩存整個數據庫視圖的Redis其中一天

步驟2之後到期:當客戶端調用API路徑「/緩存/餘額/ {日期}」,該服務僅返回緩存數據庫視圖的子集。

要實現這一點,我使用

Request和Response模式

[Route("/balances", "GET", Notes = "A call to Db which extracts the entire Db balance view")] 
public class GetBalances : IReturn<GetBalancesResponse> 
{ 

} 

[Route("/cached/balances/{Date}", "GET", Notes = "Gets a subsection of cached balanced")] 
public class GetCachedBalances : IReturn<GetBalancesResponse> 
{ 
    public int Date { get; set;} 
    public int? EntityId { get; set;} 
} 

public class GetBalancesResponse 
{ 
    public List<BalanceView> Result { get; set; } 
} 

服務接口

public object Any(GetBalances request) 
{ 
    var balances = Db.Select<BalanceView>(); 
    return new GetBalancesResponse {Result = balances }; 
} 

public object Any(GetCachedBalances request) 
{ 
     GetBalances balancesRequest = request.ConvertTo<GetBalances>(); 

    // get the cached response 
     var allBalances = (CompressedResult)base.Request.ToOptimizedResultUsingCache(
       this.CacheClient, "urn:balances",() => { 
        var service = this.ResolveService<BalanceServices>(); 
        return (GetBalancesResponse)service.Any(balanceRequest); 
       }); 

      // filter the results -> this does not work! 
      var filterBalances = response.Response.ConvertTo<GetBalancesResponse>().Result.Where(Ar => Ar.Date == request.Date && (Ar.EntityId == request.EntityId || request.EntityId == null)); 

    return new GetBalancesResponse {Result = filteredBalances}; 
} 

餘額的過濾不工作,我似乎無法將壓縮結果轉換爲ResponseDto。

回答

1

我可能對我自己的問題有一個答案。

的serviceInterface等GetCachedBalances可以被過濾爲每如下

public object Any(GetCachedBalances request) 
    { 
    GetBalances balancesRequest = request.ConvertTo<GetBalances>(); 

    // cache everything 
    var filteredCachedResponse = (CompressedResult)base.Request.ToOptimizedResultUsingCache(
      this.CacheClient, "urn:balances",() => { 
       var service = this.ResolveService<BalanceServices>(); 
       return ((GetBalancesResponse)service.Any(balanceRequest)).Result.Where(Ar => Ar.Date == request.Date && (Ar.EntityId == request.EntityId || request.EntityId == null)); 
      }); 

    // filter cached response 
    var filteredResponse = base.Cache.Get<GetBalanceResponse>("urn:balances"). 
        Result.Where(Ar => Ar.Date == request.Date && (Ar.EntityId == request.EntityId || request.EntityId == null)); 

     return filteredResponse; 
    } 
+0

注意CompressedResult在其最終形式,他們正在直接寫在ResponseStream封裝壓縮序列化的字節,所以你不能反序列化回到DTO中,您需要直接在緩存中存儲/檢索DTO(即不使用ToOptimizedResult),或者在緩存結果之前進行任何處理,如同在此處執行的操作。 – mythz

+0

@mythz - 剛剛意識到我自己的答案並不完全是我所期待的。我希望緩存整個DbView,然後只返回緩存的一個子集。然而,這似乎不可能,因爲這樣做的唯一方法是以某種方式將其反序列化爲DTO並根據請求參數對其進行過濾。 –

+1

您可以通過直接訪問base.Cache來緩存和檢索DTO。 – mythz

相關問題