使用Redis,MongoDB,ServiceStack进行.NET会话状态缓存

时间:2012-05-13 15:11:31

标签: mongodb redis servicestack distributed-caching

我一直在研究是否可以在外部数据库(如Redis,MongoDb或其他高度可扩展的工具)中缓存.NET会话状态。

我的研究结果是,尽管MongoDB有更多的集成来完成这类工作,但似乎Redis的性能要高得多,而且还有更多的选项(密钥过期,集合等)可供使用。

还有另一个名为ServiceStack的框架,它有一个RedisClient的实现,但恕我直言,它的实现方式远比我想要的更多。

 public override object OnGet(CachedOrders request)
    {
        var cacheKey = "some_unique_key_for_order";
        return base.RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey, () =>
            {
                    //This delegate will be executed if the cache doesn't have an item
                    //with the provided key

                //Return here your response DTO
                //It will be cached automatically
            });
    }

所以在这项研究之后,我想知道您的意见,以及您是否已在任何应用中实施此类缓存。你能分享一下你的经历吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

ServiceStack's缓存没有耦合,ToOptimizedResultUsingCache()方法只是convenience Extension method,允许您在必要的最小样板中实现公共缓存模式。 ToOptimizedResult方法根据IRequestContext中的MimeType和CompressionType返回最优化的结果。例如在JSON服务中,它通常是JSON Response DTO的deflate'd输出。

您不必使用扩展方法,可以直接访问ICacheClient API,因为它是ServiceBase类中的自动连线属性。如果您需要比ICacheClient API提供的功能更多的功能,我建议使用RedisServiceStack's C# RedisClient,这样您就可以快速,原子地访问分布式comp-sci集合。

使用ICacheClient API的好处是它是一个可测试的实现无关的缓存接口,目前有InMemory, Redis and Memcached providers

答案 1 :(得分:0)

我在2年前写了一个NuGet包,从那时起我们就一直在生产中使用它。它使用自定义类覆盖.NET SessionStateProvider,该类允许对Redis进行持久化,具有以下各种功能:

  • 仅在值更改时写入Redis
  • 来自具有相同会话ID的多个请求的并发会话访问
  • 能够从Web API访问会话(尽管这样做违反了REST原则,如果您愿意)
  • 轻松自定义序列化格式(自行滚动或更改Json结构)

您可以在此处获取:https://www.nuget.org/packages/RedisSessionProvider

文档:https://github.com/welegan/RedisSessionProvider