如何使用StackExchange.Redis向从机写入数据?
我经常和一对Redis服务器交谈,一个主服务器和一个从服务器。当我对主人不满意时,我就不能给奴隶写信了 我将如何使用StackExchange.Redis向从机写入数据?,redis,stackexchange.redis,Redis,Stackexchange.redis,我经常和一对Redis服务器交谈,一个主服务器和一个从服务器。当我对主人不满意时,我就不能给奴隶写信了 我将IServer.allowslavewwrites设置为true,并将两台服务器上的从机只读配置设置设置为否。(信息确认) 当主机仍在客户机的服务器池中(但脱机)时,我得到: 在第一种情况下,它似乎试图与主人交谈,并放弃失败。在第二种情况下,它与从机通信,但无法执行写操作 如何让我的客户机在没有主服务器的情况下写入从属服务器 (另请参见)事实证明,该库是硬编码的,不允许对从机执行写入操作
IServer.allowslavewwrites
设置为true
,并将两台服务器上的从机只读
配置设置设置为否
。(信息确认)
当主机仍在客户机的服务器池中(但脱机)时,我得到:
在第一种情况下,它似乎试图与主人交谈,并放弃失败。在第二种情况下,它与从机通信,但无法执行写操作
如何让我的客户机在没有主服务器的情况下写入从属服务器
(另请参见)事实证明,该库是硬编码的,不允许对从机执行写入操作 在
消息的构造函数中(Message.cs,第170行),有以下代码:
bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();
IsMasterOnly()
为所有写入命令返回true
SetMasterOnly()
覆盖用户提供的所有主/从标志,以支持CommandFlags.DemandMaster
。当系统尝试写入从设备时,此标志会触发上面引用的RedisConnectionException
我不确定为什么会有这种硬编码的覆盖,因为allowslaveswrites
标志和slave\u read\u
config值已经可以防止意外的slave写入(请参见WriteMessageToServer()
)
无论如何,从Message.cs中删除这些行似乎可以实现预期的操作。我最近遇到了类似的问题。下面是我如何修复它的:
IConnectionMultiplexer con = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase db = con.GetDatabase();
db.Execute("ZINTERSTORE", key, 2, first, second, "WEIGHTS", 0, 1);
正如您在上面所看到的db.Execute
方法就可以实现这一点 这是我的代码:
IServer ser = RedisConn.GetServer("192.168.1.1", 6379);
ser.AllowSlaveWrites = true;
ser.Execute("set",new object[2] { "test",1});
虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
IConnectionMultiplexer con = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase db = con.GetDatabase();
db.Execute("ZINTERSTORE", key, 2, first, second, "WEIGHTS", 0, 1);
IServer ser = RedisConn.GetServer("192.168.1.1", 6379);
ser.AllowSlaveWrites = true;
ser.Execute("set",new object[2] { "test",1});