csredis
csredis copied to clipboard
状态不可用,等待后台检查程序恢复方可使用 Connect to server timeout
【aiyunrds:6379/0】状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout
运行一段是时间后出现上面这个问题
centos 7
csrediscore 3.6.5 and csrediscore 3.15
尝试过 #324 里面的方案还是不行,
连接字符串如下
"ConnectionString": "rds:6379,password=***,idleTimeout=15000,tryit=2,poolsize=500,preheat=10,syncTimeout=15000,testcluster=false"
重启linux 还是不行
connectTimeout=30000
【aiyunrds:6379/0】状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout
连接超时才会这样,默认是5秒超时。
但是本地不会哦,线上也是可以ping 通的
connectTimeout=30000
加了也不行,就是线上liunx 环境会这样,而且这个环境之前也是可以的
aiyunrds:6379
这是什么,确定能连?
阿里云的 redis 只是做个说明,线上的不是这样
我发现出现这种情况是在程序更新的时候,应用程序有两台负载 A,B 我这边更新的时候一般是先更新A服务器验证情况然后在更新到B,但是有时候,更新完A之后再重启A服务的应用,之后redis就无法连接了,导致B也无法链接 redis服务器,报的错误都是 状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout 服务器AB都是linux centos 7 ,redis使用的是阿里云的云服务
demo 复现了问题 开一个线程订阅 很多线程发布和插入操作 就会出现 在3.6.5, 3.6.6版本都会奔溃 3.5.5 可以跑较长时间不出现问题 `using System; using System.Collections.Concurrent; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using CSRedis; using Newtonsoft.Json; using Newtonsoft.Json.Converters;
namespace MG.Redis.CSRedis.Test
{
class Program
{
public class DispatchRecordDTO
{
public DateTime SendTime { get; set; }
public long testInt { get; set; }
public string testTxt { get; set; }
}
public static long ToUnixTime(DateTime dateTime)
{
return (dateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000;
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
//var redis = new RedisService(new RedisOption()
//{
// RedisHost = "127.0.0.1",
// DefaultIndex = 0,
// RedisPort = 6379,
// asyncPipeline = true,
// ConnectTimeout = 15000,
// Poolsize = 100,
//});
var redis = new CSRedisClient("127.0.0.1:6379,defaultDatabase=0,ssl=false," +
"writeBuffer=10240,preheat=2,Poolsize=100,idleTimeout=20000,syncTimeout=20000,asyncPipeline=true,connectTimeout=15000");
//var redis = new CSRedisClient("127.0.0.1:6379,defaultDatabase=0,ssl=false,writeBuffer=10240,preheat=false");
var tasks = new ConcurrentBag
try
{
redis.Subscribe(("key", c =>
{
//if (c.Body.Contains("不可用"))
Console.WriteLine(c.Body);
var sb = new StringBuilder();
Console.WriteLine("test1");
sb.Append($"127.0.0.1:6379/0统计信息\r\n");
redis.Nodes.Values.ToList().ForEach(c =>
{
sb.Append(c.Statistics + "\r\n");
});
Console.WriteLine(tasks.Count + "\r\n");
Console.WriteLine(sb.ToString());
}
));
}
catch (Exception e)
{
Console.WriteLine(e);
}
for (int i = 0; i < 60000; i++)
{
Task.Run(() =>
{
while (true)
{
var guid = Guid.NewGuid().ToString();
try
{
if (!tasks.Contains(Thread.CurrentThread.ManagedThreadId))
{
tasks.Add(Thread.CurrentThread.ManagedThreadId);
}
//redis.RedisInstance.Set($"{guid}_test", "1", 1000);
//redis.RedisInstance.Get($"{guid}_test");
//redis.RedisInstance.PublishNoneMessageId("key", $"{DateTime.Now}test{Thread.CurrentThread.ManagedThreadId}");
//redis2.RedisInstance.Set($"{guid}_test", "1", 1000);
//redis2.RedisInstance.PublishNoneMessageId("key", $"{DateTime.Now}test{Thread.CurrentThread.ManagedThreadId}");
var key = $"{DateTime.Now.ToString("yyyyMMdd")}_test_DispatchLog";
var t = new DispatchRecordDTO()
{
SendTime = DateTime.Now,
testInt = 111,
testTxt = $"aaaaaaa"
};
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
_ = redis.ZAddAsync(key, (ToUnixTime(DateTime.Now), JsonConvert.SerializeObject(t
, Formatting.Indented, timeFormat))).Result;
_ = redis.ExpireAsync(key, TimeSpan.FromSeconds(2));
_ = redis.PublishNoneMessageIdAsync("key",
$"{Thread.CurrentThread.ManagedThreadId}test").Result;
Task.Delay(100).Wait();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
});
}
Console.ReadKey();
}
}
} `
跑3.5.5 又会出现(【127.0.0.1:6379/9】状态不可用,等待后台检查程序恢复方可使用。Client is not connected)
跑3.5.5 又会出现(【127.0.0.1:6379/9】状态不可用,等待后台检查程序恢复方可使用。Client is not connected)
没用的,我试过很多次了
可以试试 FreeRedis
已经收到邮件