在使用csredis获取sentinel时产生运行时异常,调查问题最后发现是获取sentinel的s-down-time配置参数存在问题。在sentinel集群中并非每个sentinel都能获取到这个参数,获取不到就抛出异常了。
获取s-down-time的代码在Types.cs文件中,RedisSentinelInfo类的构造函数:
public RedisSentinelInfo(SerializationInfo info, StreamingContext context): base(info, context) SDownTime = info.GetInt64("s-down-time");
由于info中不存在s-down-time,在此出现了异常。
在网上找到一个从SerializationInfo中安全获取某个值的方法:
/// <summary> /// Get a value from an instance of the SerializationInfo /// </summary> /// <typeparam name="T"></typeparam> /// <param name="info"></param> /// <param name="key"></param> /// <returns></returns> private T GetSerializationItemValue<T>(SerializationInfo info, string key) { foreach (SerializationEntry entry in info) { if (entry.Name == key) { return (T)Convert.ChangeType(entry.Value, typeof(T), System.Globalization.CultureInfo.InvariantCulture); } } return default(T); }
如果对应的值不存在,则返回指定类型的默认值。
因此修改获取s-down-time的方法为:
// safety get from SerializationInfo var s_down_time = GetSerializationItemValue<Int64>(info, "s-down-time"); SDownTime = s_down_time == 0 ? -1 : s_down_time;
重新编译后问题解决。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论