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。
注意CompressedResult在其最終形式,他們正在直接寫在ResponseStream封裝壓縮序列化的字節,所以你不能反序列化回到DTO中,您需要直接在緩存中存儲/檢索DTO(即不使用ToOptimizedResult),或者在緩存結果之前進行任何處理,如同在此處執行的操作。 – mythz
@mythz - 剛剛意識到我自己的答案並不完全是我所期待的。我希望緩存整個DbView,然後只返回緩存的一個子集。然而,這似乎不可能,因爲這樣做的唯一方法是以某種方式將其反序列化爲DTO並根據請求參數對其進行過濾。 –
您可以通過直接訪問base.Cache來緩存和檢索DTO。 – mythz