我一直在研究是否可以在外部数据库(如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
});
}
所以在这项研究之后,我想知道您的意见,以及您是否已在任何应用中实施此类缓存。你能分享一下你的经历吗?
谢谢!
答案 0 :(得分:5)
ServiceStack's缓存没有耦合,ToOptimizedResultUsingCache()
方法只是convenience Extension method,允许您在必要的最小样板中实现公共缓存模式。 ToOptimizedResult
方法根据IRequestContext中的MimeType和CompressionType返回最优化的结果。例如在JSON服务中,它通常是JSON Response DTO的deflate'd输出。
您不必使用扩展方法,可以直接访问ICacheClient API,因为它是ServiceBase
类中的自动连线属性。如果您需要比ICacheClient API提供的功能更多的功能,我建议使用Redis和ServiceStack's C# RedisClient,这样您就可以快速,原子地访问分布式comp-sci集合。
使用ICacheClient
API的好处是它是一个可测试的实现无关的缓存接口,目前有InMemory, Redis and Memcached providers。
答案 1 :(得分:0)
我在2年前写了一个NuGet包,从那时起我们就一直在生产中使用它。它使用自定义类覆盖.NET SessionStateProvider
,该类允许对Redis进行持久化,具有以下各种功能:
您可以在此处获取:https://www.nuget.org/packages/RedisSessionProvider