Определите, если Redis соединение перед подключением - PullRequest
0 голосов
/ 07 июля 2011

Я реализовал сервер Redis (который будет использоваться в качестве кэша данных) для веб-приложения (ASP.NET).

Одна из целей разработки - обеспечить нормальное функционирование веб-приложения в случае сбоя сервера Redis.

В настоящее время это работает, однако очень очень медленно .

ниже - фрагмент кода из класса, который имеет дело с Redis:

public string GetCachedData(string k)
    {
        string res = string.Empty;


        if (ConfigurationManager.AppSettings.GetValues("UseMemcache")[0].ToString() == "False")
        {
            return res;
        }

        try
        {
            using (RedisClient rs = new RedisClient(ConfigurationManager.AppSettings.GetValues("RedisServerIP")[0].ToString()))
            {
                byte[] buf = rs.Get(k);

                if (buf != null)
                {
                        res = System.Text.ASCIIEncoding.UTF8.GetString(buf);
                }   
            }
        }
        catch (Exception)
        {
            res = "";
        }

        return res;
    }

Вопрос:

На линии

(RedisClient rs = new RedisClient)

Здесь приложение будет блокироваться на длительное время, прежде чем выдать исключение.

Как это можно сделать так, чтобы он сразу бросал?

1 Ответ

1 голос
/ 08 июля 2011

Вы не можете обнаружить сетевые тайм-ауты мгновенно, но вы можете минимизировать влияние. Проблема в том, что вы пытаетесь установить соединение и получаете время ожидания для каждого запроса. Попробуйте эту версию - в случае ошибки она прекратит попытки использовать кеш в течение следующих пяти минут.

public DateTime LastCacheAttempt {get;set;}
private bool? UseMemCache {get;set;}

public string GetCachedData(string k)
{
    string res = string.Empty;

    if (UseMemCache == null) {
        UseMemCache = ConfigurationManager.AppSettings.GetValues("UseMemcache")[0].ToString() != "False";
        if (!UseMemCache) LastCacheAttempt == DateTime.MaxValue;
    }

    if (UseMemCache || LastCacheAttempt < DateTime.Now.AddMinutes(-5))
    {

    try
    {
        using (RedisClient rs = new RedisClient(ConfigurationManager.AppSettings.GetValues("RedisServerIP")[0].ToString()))
        {
            byte[] buf = rs.Get(k);

            if (buf != null)
            {
                    res = System.Text.ASCIIEncoding.UTF8.GetString(buf);
            }   
        }
    }
    catch (Exception)
    {
        UseMemCache = false;
        LastCacheAttempt = DateTime.Now;
    }
    }
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...