波斯马BOSSMA Information Technology

修复csredis获取redis sentinel的问题

发布时间:2015年3月14日 / 分类:DOTNET, Redis / 10,854 次浏览 / 评论

在使用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;

重新编译后问题解决。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《修复csredis获取redis sentinel的问题

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论