c# – 从Azure连接到Redis抛出间歇性异常

我有一个运行我的C#应用​​程序的
Windows Azure服务器.它分布在4个媒体实例上,我使用Redis进行L2缓存.该应用程序正在处理相当不错的流量(每天大约300,000次浏览量).我正在使用BookSleeve进行redis连接,在应用程序启动和运行后,它将开始从BookSleeve抛出SocketExceptions大约四次.确切的例外是:

Exception type: System.Net.Sockets.SocketException
Exception message: A connection attempt failed because the connected party did not     properly respond after a period of time, or established connection failed because connected host has failed to respond

似乎只有在我从服务器上读取内容时才会发生:

using (var connection = ConnectionGateway.GetReadConnection())
{
    var task = connection.Hashes.GetString(App.RedisDatabase, CacheKeys.My_KEY);
    var result = connection.Wait(task);
}

我的GetReadConnection设置如下:

    public static RedisConnection GetReadConnection()
    {
        RedisConnection conn = getNewConnection();

        try
        {
            var openAsync = conn.Open();
            conn.Wait(openAsync);

            return conn;
        }
        catch (SocketException ex)
        {
            throw new Exception(RedisConnectionFailed, ex);
        }
    }

现在我的所有写入都像作者描述的那样共享一个连接,所以这只发生在需要使用connection.Wait()的读取上.这一切似乎都很好.写入使用类似于Maintaining an open Redis connection using BookSleeve的代码

我已经尝试将Redis服务器的超时更改为Azure负载均衡器的帐户但没有成功.我已尝试设置超时30并设置超时0,如下所述:Redis connection errors when using Booksleeve Redis client in Azure VM

真的很感激任何帮助.

最佳答案 看一下代码,首先发生的是你似乎每次读取操作都要创建一个连接.这不是必需的,并且可能对.net和redis产生负面影响:BookSleeve是一个多路复用器 – 它旨在通过单个连接同时处理大量请求.当你调用Wait时,它只是阻塞的等待线程 – BookSleeve的内部将继续处理其他线程等.

此外,创建连接会产生相当多的开销:除了建立新TCP连接的成本之外,BookSleeve还需要与redis服务器通信以查找正确操作所需的一些关键配置信息,因此始终建议重用单个共享连接或少量共享连接.

点赞