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

时间:2016-05-31 19:33:21

标签: redis stackexchange.redis

我正在使用StackExchange.Redis与一对Redis服务器,主服务器和从服务器通信。当我让主人失败时,我无法写信给奴隶。

我将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?

2 个答案:

答案 0 :(得分:3)

事实证明,库是硬编码的,不允许对从属进行写操作。

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

bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();
对于所有写命令,

IsMasterOnly()返回trueSetMasterOnly()会覆盖用户提供的所有主/从标志,以支持CommandFlags.DemandMaster。当系统尝试写入从站时,此标志会触发上面引用的RedisConnectionException

我不确定为什么这个硬编码覆盖在那里,因为AllowSlaveWrites标志 slave_read_only配置值已经防止了意外的从属写入(参见WriteMessageToServer())。

在任何情况下,从Message.cs中删除这些行似乎都允许进行预期的操作。

答案 1 :(得分:0)

我最近有类似的问题。以下是我修复它的方法:

db.Execute

正如您所看到的,from somemodule import print as print_this 方法可以解决问题。