csredis
csredis copied to clipboard
状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout. detail: Connect to server timeout.
和这个问题奋斗了一天,终于找到了规律。 描述下:本机没问题,因为redis在远程,测试环境偶发问题,产品环境出现概率最高,因为产品环境配置最高,阿里云redis服务器内网连接很快,所以出现概率高。(产品环境尚未上线,没有访问量) 瞬间压100个请求过去,线程卡死,然后报改错误。 立刻再执行,无比丝滑不报错。过一会又报错。 反复寻找规律,发现当服务空闲20秒以上时候,瞬间压100个请求进来该错误必现,因此把目标锁定在了idleTimeout配置上(默认20秒)。 我修改参数到30,果然此问题出现时机也延长了10秒。 我把idleTimeout设置成了10分钟,果然10分钟内不再出现该问题。 由于未深入研究,因此不知道如何控制这个参数,请帮忙看看哈。
一般云服务器都会主动断开,长时间不使用的连接。如果此时继续使用连接,等待15秒后,报错网络超时,或者连接已关闭。关键问题就是这个等待15秒,让系统很难受。
多长时间,就是 Idletimeout 参数值了,尽量与服务器断开设置值差不多。client 在每次使用连接时,判断上一次使用时间与当前差,在和 Idletimeout 对比,如果大于则关闭连接,新建 socket。
设置了 idletimeout,实际情况如果一直在使用连接,就不会重建 socket。
多谢,如果将idletimeout设置很大,会带来巨大弊端么
外网访问没问题,只有内网速度很快的情况下,瞬间过去大量请求才会有这个问题。
并发 new socket 可能会触发云服务器防公里策略,此时可能会被认为攻击,一般会拒绝访问网络,过几十秒或几分钟后才恢复。
设置大没有弊端
如果允许,可以考虑使用FreeRedis
https://github.com/2881099/FreeRedis
我今天也试了一下Freeredis,本想切换试试,但是发现set和get泛型List
get list数组会报错,set的话会存进去一个类型名称
明天我再试试freeredis哈,多谢,早点休息
FreeRedis 要单独设置序列化
public static RedisClient cli = new RedisClient("127.0.0.1:6379,password=123,defaultDatabase=13"); cli.Serialize = obj => JsonConvert.SerializeObject(obj); cli.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type); cli.Notice += (s, e) => Console.WriteLine(e.Log);
原来如此,明天我试试哈!