2

我一直在研究是否可以在外部数据库(如 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
            });
    }

所以在这项研究之后,我想知道你的意见,以及你是否在你的任何应用程序中实现了这种缓存。你能分享你的经验吗?

谢谢!

4

2 回答 2

5

ServiceStack 的缓存不是耦合的,该ToOptimizedResultUsingCache()方法只是一种方便的扩展方法,允许您在必要的最小样板中实现通用缓存模式。该ToOptimizedResult方法根据来自 IRequestContext 的 MimeType 和 CompressionType 返回最优化的结果。例如,在 JSON 服务中,它通常是 JSON 响应 DTO 的放气输出。

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

使用ICacheClientAPI 的好处是它是一个可测试的与实现无关的缓存接口,目前有InMemory、Redis 和 Memcached 提供程序

于 2012-05-13T15:52:04.750 回答
0

2 年前我为此编写了一个 NuGet 包,从那时起我们就一直在生产中使用它。它使用允许持久性到 Redis 的自定义类覆盖 .NET SessionStateProvider,具有各种功能,例如:

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

你可以在这里得到它:https ://www.nuget.org/packages/RedisSessionProvider

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

于 2014-09-10T14:12:34.667 回答