【问题标题】:Redis caching with ServiceStack OrmLite and SQL Server persistence使用 ServiceStack OrmLite 和 SQL Server 持久性进行 Redis 缓存
【发布时间】:2015-06-09 17:56:10
【问题描述】:

我们有一个带有 SQL Server 后端的 Web 应用程序 (ASP.NET/C#)。我们使用 ServiceStack OrmLite 作为我们的 POCO Micro ORM。我们现在想扩展我们应用程序的一部分来缓存经常读取的数据(主要是作为值的 POCO 对象的集合,带有数字键)。但我不确定如何集成一个简单的缓存解决方案(内存中或基于 Redis),该解决方案与 OrmLite 和 MSSQL 作为主数据库无缝协作。

我已阅读有关 ServiceStack Redis 客户端、MemoryCacheClient 和多嵌套数据库连接 (OrmLiteConnectionFactory) 的信息,但我找不到任何示例、教程或代码示例来了解有关实现与 OrmLite 一起使用的缓存的更多信息。

任何建议或链接都​​会有所帮助,非常感谢。

【问题讨论】:

    标签: redis servicestack ormlite-servicestack


    【解决方案1】:

    我使用这个扩展来帮助简化数据库和缓存之间的集成。

    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; }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要自己实现缓存逻辑,但工作量不大 - 这是一个伪代码示例:

          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;
      
              }
          }
      

      【讨论】:

      • 谢谢丹,这会奏效。我希望可能有更好的(更无缝,更少的粘合)方式来让 OrmLite 和 Redis 客户端一起工作。我想这是一个值得集成到 OrmLite 中的功能。
      • 如果您正在寻找具有插件可扩展性的 Orm,那么您可能需要 NHibernate - 事实上,有人已经插入了 ServiceStack.Redis 缓存,请参见此处:d80.co.uk/post/2011/05/17/NHibernate-Caching-with-Redis.aspx OrmLite 专注于轻量级和炽热以牺牲功能为代价快速,NHibernate 是一个 800 磅的大猩猩,它并不适合所有项目,但如果您需要插件缓存、审计日志记录、使用 Lucene 的全文索引等功能,那么它绝对值得一看但会以牺牲复杂性和性能为代价。
      • 同意丹。 NHibernate 对于我的需要来说太臃肿了(而且会很慢)。我想我可以按照您提供的包装代码行使用一些东西。
      【解决方案3】:

      您检查过Service stack caching wiki。它提供了有关缓存的详细信息。现在,根据您提供的详细信息,我可以说您可以进行任何类型的缓存。到目前为止,它不会有任何区别。

      PS:当没有选项或唯一未决的应用程序时,应该进行一条建议缓存。因为它本身的问题是使缓存、管理和所有这些无效。因此,如果您的应用程序不是太大,请暂时搁置它。

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 2012-06-28
        • 2016-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        相关资源
        最近更新 更多