从c#

时间:2016-01-15 14:43:10

标签: c# stackexchange.redis redis-sentinel

我有一个主从配置,有两个奴隶和三个哨兵。如果我用命令行尝试命令一切正常。 但是我在为C#配置它时遇到了一些问题。 我正在使用StackExchange.Redis库。但我不明白我应该做什么来获取/设置主人的密钥。我应该手动找到主设备然后获取或设置密钥还是自动执行?最好的方法是什么?每次我想获取/设置一个密钥时,我应该检查谁是主人? 现在我只做了这个,我只剩下其他代码,只有一个主人。

private static string ServiceName = "mymaster";
private static string IP { get { return "127.0.0.1"; } }
private static int Port = 26379;

public static readonly ConnectionMultiplexer Connection = GetConn();
public static readonly IServer Server = Connection.GetServer(IP, Port);

public static ConnectionMultiplexer GetConn()
{
    try
    {
        // create a connection
        var options = new ConfigurationOptions()
        {
            CommandMap = CommandMap.Sentinel,
            EndPoints = { { IP, Port } },
            AllowAdmin = true,
            TieBreaker = "",
            ServiceName = ServiceName,
            SyncTimeout = 5000,
            AbortOnConnectFail = true,
            Ssl = false
        };
        var connection = ConnectionMultiplexer.Connect(options, Console.Out);
        return connection;
    }
    catch (Exception ex)
    {
        ASLog.LogError(ex, 1);
        return null;
    }
}

我在港口26379有三个哨兵中的一个。 抱歉,我对如何在C#中使用它感到困惑。

2 个答案:

答案 0 :(得分:0)

您无需指定或检查主节点,库将选择主机进行写操作。

无论如何,所有方法都有一个可选的CommandFlags参数,您可以在其中指定执行操作的位置(DemandMaster,DemandSlave,PreferMaster,PreferSlave)。

例如:

var cnn = ConnectionMultiplexer.Connect("localhost:6379");
var db = cnn.GetDatabase();
db.StringSet("key", "value", null, When.Always, CommandFlags.DemandMaster);
var value = db.StringGet("key", CommandFlags.PreferSlave);

答案 1 :(得分:0)

我能够通过从Command.Sentinel更改CommandMap来解决我的问题,

    var commands = new Dictionary<string, string> {
                    { "info", null }, // disabled
                    { "select", "use" },
            };
    sentinelConfig.CommandMap = CommandMap.Create(commands);

错误应该消失。