Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core分布式Redis缓存:断开连接_C#_Asp.net Core_Redis_Stackexchange.redis - Fatal编程技术网

C# ASP.NET Core分布式Redis缓存:断开连接

C# ASP.NET Core分布式Redis缓存:断开连接,c#,asp.net-core,redis,stackexchange.redis,C#,Asp.net Core,Redis,Stackexchange.redis,我正在使用Redis缓存作为ASP.NET应用程序中的分布式缓存。 它会一直工作到Redis服务器不可用为止,问题是: 如何正确处理断开连接问题 Redis是这样配置的(Startup.cs): services.AddDistributedRedisCache(…) 选项AbortOnConnectFail设置为false 通过构造函数注入服务: ... private IDistributedCache _cache public MyService(IDistributedCache

我正在使用Redis缓存作为ASP.NET应用程序中的分布式缓存。 它会一直工作到Redis服务器不可用为止,问题是: 如何正确处理断开连接问题

Redis是这样配置的(Startup.cs):

services.AddDistributedRedisCache(…)
选项AbortOnConnectFail设置为false

通过构造函数注入服务:

...
private IDistributedCache _cache

public MyService(IDistributedCache cache)
{
  _cache = cache;
}
Redis关闭时,以下代码引发异常(StackExchange.Redis.RedisConnectionException:SocketFailure on 127.0.0.1:6379/订阅…):

我不认为使用反射检查缓存对象内部的连接状态是一种好方法。那么有什么“正确”的选择来处理它吗?

也许你可以检查一下。它有Retry/Wait和Retry/RetryForever以及方便使用的断路器。因此,您可以捕获该
RedisConnectionException
,然后重试或回退到其他方法

您有Microsoft DistributedCache提供程序的插件


首先,为什么您的Redis服务器变得不可用?多久?你应该尽量减少这种情况。您是否将Redis用作AWS的服务,即ElasticCache?如果是这样,您可以将其配置为在第一个主服务器出现故障时将新的Redis从属/读取应答服务器升级为主服务器

要提高容错能力并减少写入停机时间,请为您的Redis(群集模式)启用具有自动故障切换功能的Multi-AZ 已禁用)包含副本的群集。有关详细信息,请参见最小化 使用多AZ的Redis在ElastiCache中停机

除此之外,对于无响应的Redis服务器,一个回退解决方案就是在Redis服务器关闭时从数据库中检索在Redis中缓存的对象/实体。您可以重试Redis调用两次,每次重试间隔5秒,如果服务器仍处于关闭状态,则只需查询数据库即可。这将导致性能下降,但这是一个比抛出错误更好的解决方案

T val = null;
int retryCount = 0;

do 
{
      try 
      {
          val = await _cache.GetAsync(key, cancellationToken);
      }
      catch(Exception ex) 
      {  
         retryCount++;
         Thread.Sleep(retryCount * 2000)
      }
 }
 while(retryCount < 3 && val == null);
 
 if (val == null) 
 {
    var = call to database
 }
T val=null;
int retryCount=0;
做
{
尝试
{
val=wait_cache.GetAsync(key,cancellationToken);
}
捕获(例外情况除外)
{  
retryCount++;
线程睡眠(retryCount*2000)
}
}
while(retryCount<3&&val==null);
if(val==null)
{
var=对数据库的调用
}

谢谢,但实际上我考虑过try/catch解决方案,但我希望有更优雅的方式。Polly很健壮,看起来是解决连接故障的优雅方式。连接失败后,你可以等待并重试,这是一件好事,或者你可以退回到特定的操作。redis不可用的原因无关紧要,关键是当它关闭时,应用程序本身应该运行,尽管性能不高。好吧,您必须找到解决方案:在Redis server关闭时从数据库查询缓存对象/数据,或者尝试实现类似于ElasticCache AWS服务中的故障切换功能,即,如果主服务器关闭,则从读取副本读取数据。
T val = null;
int retryCount = 0;

do 
{
      try 
      {
          val = await _cache.GetAsync(key, cancellationToken);
      }
      catch(Exception ex) 
      {  
         retryCount++;
         Thread.Sleep(retryCount * 2000)
      }
 }
 while(retryCount < 3 && val == null);
 
 if (val == null) 
 {
    var = call to database
 }