C#上的Redis Hash在WCF服务中速度极慢

时间:2013-07-11 21:26:38

标签: c# iis redis

我是Redis的新手开始使用redis哈希存储一些对象,我遇到了一些非常意外的性能问题。我在vmware播放器上本地托管的Ubuntu机器上运行redis。

我的虚拟机是两个核心,内存为4 GB。

继续我正在尝试的代码。

using (var redis = new RedisClient())
{              
    using (var client = redis.As<MyClass>())
    {
        var hash = client.GetHash<Guid>("urn:class");                   
        var items = hash.Values;
    }
}

哈希包含从我们的实体模型添加的大约2000个项目。为了从哈希中获取所有的值在我的运行期间需要7秒,这对于redis在我的实例中的一点点硬件来说似乎很高。对同一数据进行正常的LINQ to Entity查询需要0.25秒。

我在这里做错了吗?考虑到我所听到的关于redis性能的所有重要事情,这似乎是错误的。

编辑:2013年12月7日

这可能是一个WCF问题。这篇文章Using Redis to Scale Web Services基本上反映了我的结果。我测试的是这个。

使用1683个对象检索Redis哈希

  • IIS中的WCF服务:7秒
  • ASP.NET Web Api:0.8秒
  • NodeJS只是为了好玩:0.8秒

Web Api和Node像魅力一样运行,并且接近我运行redis-benchmark时的时间。

1 个答案:

答案 0 :(得分:1)

我的问题在于我使用的类作为Redis客户端的上下文。该类是使用具有对象上下文的旧版本实体框架生成的实体模型。生成实体的方式导致ServiceStack.Redis客户端必须执行大量工作来反序列化从Redis返回的对象。实体导航属性的set方法可以调用

InitializeRelatedCollection()

每次json解析器必须反序列化通过Redis客户端返回的对象时,都会调用

。在没有导航属性的情况下切换到更简单的对象工作正常,并将时间带回到我期望的与我的其他测试一致的数字。

我在ASP.NET Web API中没有看到这种速度变慢的原因是因为实体是使用新的DbContext模型生成的,而ServiceStack中的Json序列化器并不需要完成它所做的大量工作在WCF项目中,因为导航属性只是简单的列表或集合。

首先让实体对象成为Redis客户端的类型可能不是一个好主意。