在使用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大全
文章分类
最新评论