2011-07-07 8 views
0

Webアプリケーション(ASP.NET)用のRedisサーバー(データキャッシュとして使用する)を実装しました。接続前にRedis接続を検出する

設計目標の1つは、Redisサーバーが停止した場合にWebアプリケーションが正常に機能するようにすることです。

現在のところ、これは動作しますが、非常に遅いです。以下

の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) 

アプリケーションがためにブロックする場所です例外をスローする前に長い時間。

これはすぐにスローされるように、どうすればできますか?

+0

Redisはこのタイプの機能を提供していますか?それはほぼ4年間続いています。 – GaTechThomas

答えて

1

ネットワークのタイムアウトを即座に検出することはできませんが、影響を最小限に抑えることができます。問題は、接続を試行し、すべての要求に対してタイムアウトを取得することです。このバージョンを試してください - エラーがある場合、次の5分間キャッシュの使用を停止します。

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; 
} 
+0

私はすでにあなたのソリューションに似た何かを考えていました。私は、クライアントAPIに何かが組み込まれていることを期待していました。私はこれが当てはまらないと思います。その場合、おそらくあなたの提案に従います。 – Darknight

+0

他の解決方法があるかどうかを少し見ています。 – Darknight

+0

私は完全な再試行/失敗戦略が組み込まれている汎用クライアントライブラリを認識していません。おそらく使い方が多すぎます - オプションのキャッシュでは機能しますが、redisがプライマリデータストアであれば完全に不適切です。 –

関連する問題