如何使用 StackExchange.Redis 写入从站?

How do I write to a slave using StackExchange.Redis?

我正在使用 StackExchange.Redis 与一对 Redis 服务器、一个主服务器和一个从服务器通信。当我让 master 失败时,我无法写入 slave。

我将 IServer.AllowSlaveWrites 设置为 true,并将两台服务器上的 slave-read-only 配置设置设置为 no。 (经 INFO 证实。)

当主服务器仍在客户端的服务器池中(但处于离线状态)时,我得到:

RedisConnectionException: SocketFailure on <master_ip>/Subscription

如果我将主服务器完全从服务器池中取出,我得到:

RedisConnectionException: No connection is available to service this operation: SET ...

第一种情况,好像是想和师父对话,失败就放弃了。第二种,它正在与从机通信,但无法执行写入操作。

如何让我的客户端在没有主服务器的情况下写入从服务器?

(另见 How does StackExchange.Redis use multiple endpoints and connections?

原来这个库是硬编码的,不允许对从设备进行写操作。

Message的构造函数中(Message.cs,第170行),有如下代码:

bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();

IsMasterOnly() returns true 用于所有写入命令。 SetMasterOnly() 覆盖用户提供的支持 CommandFlags.DemandMaster 的任何 master/slave 标志。当系统尝试写入从站时,此标志会触发上面引用的 RedisConnectionException

我不确定为什么这个硬编码覆盖在那里,因为 AllowSlaveWrites 标志 slave_read_only 配置值已经防止意外从属写(见 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});