我是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哈希
Web Api和Node像魅力一样运行,并且接近我运行redis-benchmark时的时间。
答案 0 :(得分:1)
我的问题在于我使用的类作为Redis客户端的上下文。该类是使用具有对象上下文的旧版本实体框架生成的实体模型。生成实体的方式导致ServiceStack.Redis客户端必须执行大量工作来反序列化从Redis返回的对象。实体导航属性的set方法可以调用
InitializeRelatedCollection()
每次json解析器必须反序列化通过Redis客户端返回的对象时,都会调用。在没有导航属性的情况下切换到更简单的对象工作正常,并将时间带回到我期望的与我的其他测试一致的数字。
我在ASP.NET Web API中没有看到这种速度变慢的原因是因为实体是使用新的DbContext模型生成的,而ServiceStack中的Json序列化器并不需要完成它所做的大量工作在WCF项目中,因为导航属性只是简单的列表或集合。
首先让实体对象成为Redis客户端的类型可能不是一个好主意。