4

我有一个主从配置,有两个奴隶和三个哨兵。如果我尝试使用命令行的命令一切正常。但是我在为 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# 一起使用。

4

2 回答 2

0

我可以通过从 Command.Sentinel 更改 CommandMap 来解决我的问题,如下所示:

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

错误应该消失。

于 2020-03-13T08:04:40.907 回答
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);
于 2016-01-18T00:57:23.713 回答