1

我刚刚开始在 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 个请求,然后崩溃。虽然我不确定我是否会承受这种负载,但我相信这表明我的代码存在明显缺陷,并且希望有人比我更聪明地指出我做错了什么。

谢谢!

4

1 回答 1

2

我注意到的第一件事是该代码太复杂而无法进入剃须刀视图 - 它需要移动到控制器。不过,这本身可能不是问题。

问题可能是正在创建的大量连接在加载下一个连接之前可能没有完全清除。从 BookSleeve 网站:

连接是线程安全的并且(除了等待之外)是非阻塞的,因此您可以根据需要在尽可能多的调用者之间共享连接 - 这允许网站非常有效地使用单个 redis 连接。此外,数据库切换(上面示例中的 12 个)是在消息级别处理的,因此您无需发出单独的 SELECT 命令 - 这允许在一组数据库上进行多租户使用,而无需同步操作。

这意味着如果您创建一个共享连接来处理 1000 个查询,那么您可能会得到更好的结果,而不是创建 1000 个连接来处理一个查询。

于 2011-07-08T04:21:31.267 回答