我有一个主从配置,有两个奴隶和三个哨兵。如果我用命令行尝试命令一切正常。 但是我在为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#中使用它感到困惑。
答案 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);
错误应该消失。