我刚开始在Windows上乱用BookSleeve(和redis),只是想知道我是否可以在这里找到我可能做错的方向。使用以下代码,然后对它运行ab,我可以在w3wsvc.exe崩溃之前提供~500个请求。当我附加到调试过程时,我看到对redis服务器的请求超时。
@using (var conn = new BookSleeve.RedisConnection("localhost"))
{
conn.Open();
var catgrabber = conn.ListRange(0,"categories",0,-1);
byte[][] categories = conn.Wait(catgrabber);
foreach (byte[] category in categories)
{
<h3> @System.Text.UTF8Encoding.UTF8.GetString(category) </h3>
var actgrabber = conn.ListRange(0, String.Format("activity:{0}",
System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_')), 0, - 1);
byte[][] activities = conn.Wait(actgrabber);
foreach (byte[] activity in activities)
{
<label for="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345">
<input type="checkbox" id="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345" value="@System.Text.UTF8Encoding.UTF8.GetString(activity)"/>
@System.Text.UTF8Encoding.UTF8.GetString(activity)
</label><br />
}
}
}
我还没有安装.NET async / await CTP。
现在,只需一个网页就可以了。我只是想在托管这个的服务器上敲打,所以我做了......
ab -n 1000 -c 5 http://server/page.cshtml
它将为500-700个请求提供服务然后崩溃。虽然我不确定我是否会遇到这种负担,但我相信这表明我的代码存在一个明显的缺陷,并希望有人比我指出我做错了更聪明。
谢谢!
答案 0 :(得分:2)
我注意到的第一件事是代码太复杂而无法进入剃刀视图 - 它需要移动到控制器。这本身可能不是问题所在。
问题可能是创建的大量连接在下一次加载之前可能无法完全清除。来自BookSleeve网站:
连接是线程安全的(并且(等待除外)非阻塞,因此您可以根据需要共享多个呼叫者之间的连接 - 这使得网站可以非常有效地使用单个redis连接。此外,数据库切换(上面示例中的12)是在消息级别处理的,因此您不需要发出单独的SELECT命令 - 这允许在一组数据库上使用多租户而无需同步操作。 / p>
这意味着如果您创建一个共享连接来处理1000个查询,那么您可能会获得比创建1000个连接以处理每个查询更好的结果。