3

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

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

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

4

3 回答 3

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; }
    }
}
于 2013-08-29T18:37:04.907 回答
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;

        }
    }
于 2013-08-07T08:37:16.233 回答
2

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

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

于 2013-08-06T09:02:07.287 回答