2014-02-27 44 views
0

我正在編寫緩存提供程序來緩存任何類型的對象。當我從高速緩存中讀取值時,問題是轉換爲正確的類型。使用Redis和服務堆棧爲Piranha編寫緩存提供程序 - 跟蹤緩存的對象類型

using (var redisClient = redisClientsManager.GetClient()) 
{ 
    redisClient.Set(key, value, new TimeSpan(1, 0, 0)); 
} 

因此,很容易將對象放入緩存中,並將其轉換爲字符串。當我來到拉出來的緩存是它得到有趣

using (var redisClient = redisClientsManager.GetClient()) 
{ 
    return redisClient.Get<object>(key); 
} 

因爲我們沒有正確的類型強制轉換爲這樣的默認這不起作用是返回JSON字符串。

我在想,也許我應該創建一個哈希我所有的食人魚對象則有這樣的事情

piranha:cache id = "{ some json }" 
piranha:cache id:type = PAGETYPE 

這將使我的設置,當我保存對象緩存對象類型。我想知道是否有更好的方法來獲取/設置緩存的對象類型?

理想情況下,代碼將顯式執行轉換,但是此刻redis中的緩存僅使用對象類型(我認爲)。


public object this[string key] 
{ 
    get 
    { 
     using (var redisClient = redisClientsManager.GetClient()) 
     { 
      if (redisClient.HashContainsEntry(PiranhaHash, key)) 
      { 
       string resultJson = redisClient.GetValueFromHash(PiranhaHash, key); 
       string objType = redisClient.GetValueFromHash(PiranhaHash, String.Format("{0}:Type", key)); 

       Type t = JsonConvert.DeserializeObject<Type>(objType); 
       object result = JsonConvert.DeserializeObject(resultJson, t); 

       return result; 
      } 
     } 
     return null; 
    } 
    set 
    { 
     using (var redisClient = redisClientsManager.GetClient()) 
     { 
      redisClient.SetEntryInHash(PiranhaHash, key, JsonConvert.SerializeObject(value)); 
      redisClient.SetEntryInHash(PiranhaHash, String.Format("{0}:Type", key), JsonConvert.SerializeObject(value.GetType())); 
     } 
    } 
} 

然而,對於這種實現應該工作Page對象將不會從Json的正確deserialise,控制器將永遠是空的大部分。我認爲必須進行一些後端更改才能實現這一點。

回答

1

由於不同的緩存提供程序的數量目前非常有限,我們總是可以改變提供程序的接口,以便從長遠角度來看效果更好。我也有一些關於使Get操作通用來清理訪問緩存的代碼的想法。

也許這個接口將在長期內更好地工作:

/// <summary> 
/// Gets the cached model for the given key. 
/// </summary> 
/// <typeparam name="T">The model type</typeparam> 
/// <param name="key">The unique key</param> 
/// <returns>The model</returns> 
T Get<T>(string key); 

/// <summary> 
/// Sets the cached model for the given key. 
/// </summary> 
/// <param name="key">The unique key</param> 
/// <param name="obj">The model</param> 
void Set(string key, object obj); 

/// <summary> 
/// Removes the cached model for the given key. 
/// </summary> 
/// <param name="key">The unique key</param> 
void Remove(string key); 

因爲這種變化將導致核心存儲庫更新的很多我要實現它在一個單獨的分支用於測試您可以實施您的提供商。


編輯

我把在Page對象仔細一看,和字段Controller, View, Redirect, IsPublished & IsStartpage計算沒有set訪問性能。這些字段不應被序列化爲JSON。正在使用哪個序列化程序以及可以使用哪些屬性來使序列化程序忽略屬性(如ScriptIgnore)。

此外TemplateController, TemplateView, TemplateRedirect & TemplateName有私人組訪問的性能,我不知道這是否會是與JSON串的問題正在使用。

問候

哈坎

+0

哈坎嗨,我認爲這將是最好的解決辦法但我仍然不知道它會在這裏解決的問題,其中Page對象無法序列/妥善deserialised成JSON。 – Neil

+0

嗨,我試了服務堆棧serialiser和牛頓軟件。明天我會嘗試爲你制定一個拉你的請求 – Neil