2013-08-02 95 views
3

我們有一個帶有SQL Server後端的Web應用程序(ASP.NET/C#)。我們使用ServiceStack OrmLite作爲我們的POCO Micro ORM。我們現在想擴展我們的應用程序的一部分來緩存經常讀取的數據(主要是POCO對象的集合作爲值,使用數字鍵)。但我不知道如何去集成一個簡單的緩存解決方案(基於內存或基於Redis),它可以與OrmLite和MSSQL無縫協作,作爲主數據庫。使用ServiceStack OrmLite和SQL Server持久性進行Redis緩存

我已閱讀關於ServiceStack Redis客戶端,MemoryCacheClient和多嵌套數據庫連接(OrmLiteConnectionFactory),但我找不到任何示例,教程或代碼示例以瞭解有關實施與OrmLite一起使用的緩存的更多信息。

任何建議或鏈接將是有益的,非常感謝。

回答

3

你需要自己實現高速緩存邏輯,但它沒有太多的工作 - 這裏的僞代碼示例:

public class QueryObject 
    { 
     public DateTime? StartDate { get; set; } 
     public string SomeString { get; set; } 
    } 

    public class Foo 
    { 
     public DateTime DateTime { get; set; } 
     public string Name { get; set; } 
    } 

    public class FooResponse 
    { 
     public List<Dto> Data { get; set; } 
    } 


    public FooResponse GetFooData(QueryObject queryObject) 
    { 
     using (var dbConn = connectionFactory.OpenDbConnection()) 
     using (var cache = redisClientsManager.GetCacheClient()) 
     { 
      var cacheKey = string.Format("fooQuery:{0}", queryObject.GetHashCode()); //insert your own logic for generating a cache key here 
      var response = cache.Get<Response>(cacheKey); 

      //return cached result 
      if (response != null) return response; 

      //not cached - hit the DB and cache the result 
      response = new FooResponse() 
       { 
        Data = 
         dbConn.Select<Foo>(
          x => x.DateTime > queryObject.StartDate.Value && x.Name.StartsWith(queryObject.SomeString)).ToList() 
       }; 
      cache.Add(cacheKey, response, DateTime.Now.AddMinutes(15)); //the next time we get the same query in the next 15 mins will return cached result 
      return response; 

     } 
    } 
+0

謝謝丹,這將工作。我希望能夠讓OrmLite和Redis Client一起工作,有更好的(更加無縫,更少粘合)方式。這是一個值得在OrmLite中整合的功能。 – Nick

+1

如果您正在尋找帶插件可擴展性的Orm,那麼您可能需要使用NHibernate - 實際上,已經有人插入了ServiceStack.Redis緩存,請參閱:http://www.d80.co.uk/post/2011/05/ 17/NHibernate-Caching-with-Redis.aspx OrmLite專注於以功能爲代價的輕量級且快速發展,NHibernate是一種800lb大猩猩,它不適合所有項目,但如果您需要插件等功能,在緩存,審計日誌記錄,使用Lucene的全文索引等等方面,那麼它絕對值得一看,但是要付出複雜性和性能。 – DanB

+0

同意丹。 NHibernate太臃腫(而且速度會很慢)滿足我的需求。我想我可以只使用你提供的包裝代碼的一些東西。 – Nick

2

您是否檢查過Service stack caching wiki。它提供了有關緩存的詳細信息。現在從你提供的細節來看,我可以說你可以進行任何類型的緩存。到目前爲止它不會有任何區別。

PS:當沒有任何選項或者應用程序中唯一掛起的東西時,應該執行一條建議緩存。因爲它自帶的問題是使緩存,管理和所有這些無效。所以,如果你的應用程序不是太大,現在就離開吧。

4

我使用這個擴展,以幫助簡化數據庫和緩存之間的集成。

public static class ICacheClientExtensions 
{ 
    public static T ToResultUsingCache<T>(this ICacheClient cache, string cacheKey, Func<T> fn, int hours = 1) where T : class 
    { 
     var cacheResult = cache.Get<T>(cacheKey); 
     if (cacheResult != null) 
     { 
      return cacheResult; 
     } 
     var result = fn(); 
     if (result == null) return null; 
     cache.Set(cacheKey, result, TimeSpan.FromHours(hours)); 
     return result; 
    } 
} 

public class MyService : Service 
{ 
    public Data Get(GetData request) 
    { 
     var key = UrnId.Create<Data>(request.Id); 

     Func<Data> fn =() => Db.GetData(request.Id); 

     return Cache.ToResultUsingCache(key, fn); 
    } 

    [Route("/data/{id}")] 
    public class GetData: IReturn<Data> 
    { 
     public int Id{ get; set; } 
    } 
}