【问题标题】:redis.exceptions.ResponseError: MOVED error in redis set operationredis.exceptions.ResponseError:redis 设置操作中的 MOVED 错误
【发布时间】:2017-08-29 17:00:09
【问题描述】:

我创建了一个包含 30 个实例(15 个主节点/15 个节点)的 Redis 集群。使用 python 代码连接到这些实例,我找到了主人,然后我想为它们添加一些键。

def settomasters(port, host):
    r = redis.Redis( host=host, port=port )
    r.set("key"+port,"value")

错误:

redis.exceptions.ResponseError: MOVED 12539 127.0.0.1:30012

如果我尝试从redis-cli -c -p portofmyinstance 设置密钥,有时我会收到一条重定向消息,告诉我密钥的存储位置。

我知道,例如,在获取请求的情况下,需要智能客户端才能将请求重定向到正确的节点(持有密钥的节点),否则会发生移动错误。是不是一样的情况?我需要捕获 redis.exceptions.ResponseError 并尝试重新设置?

while True:
    try:
        r.set("key","value")
        break
    except:
        print "error"
        pass

我的第一次尝试是上面的代码,但没有解决方案。设置操作永远不会成功。

另一方面,javascript中的以下代码不会引发错误,我无法弄清楚原因:

var redis = require('redis-stream'),
client = new redis(30001, '127.0.0.1');

// Open stream
var stream = client.stream();

// Example of setting 200 records
for(var record = 0; record <200; record++) {
    var command = ['set', 'qwerty' + record, 'QWERTYUIOP'];  
    stream.redis.write( redis.parse(command) );
}

stream.on('close', function () {
console.log('Completed!');
});

// Close the stream after batch insert
stream.end();

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: javascript python redis


    【解决方案1】:

    使用 redis 集群,只有当您“找到某个键​​的属于的插槽,然后是每个主服务器服务的插槽时,您才能使用普通的 redis 客户端。有了这些信息,我可以将键设置到正确的节点,而无需移动重定向错误。”正如@Antonis 所说。否则你需要http://redis-py-cluster.readthedocs.io/en/master/

    【讨论】:

    • 半真。当然这是正确的方法,但不是绝对的。我设法通过为某个键找到所属的插槽然后找到每个主服务器服务的插槽来解决我的问题。有了这些信息,我可以将键设置到正确的节点,而不会出现移动重定向错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2014-07-05
    • 2017-06-13
    相关资源
    最近更新 更多