当我每个evalsha只发送一个密钥时,为什么redis管道会给出跨插槽错误?

2024-06-02 23:47:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用redis py,并且我正在尝试通过管道传输多个evalsha命令。每个evalsha命令在一个键上工作

尽管如此,在pipeline.execute()的末尾,我得到了一个Crossslot错误

当我在一个evalsha命令中使用多个键时,如果它们散列到不同的插槽,但我一次只使用一个键,则应该抛出交叉批错误,那么为什么会出现此错误

这是该代码的一个版本-

def batcher(self, iterable, n):
args = [iter(iterable)] * n
return itertools.zip_longest(*args)

redis_node = redis.Redis(host=host, port=port, db=0)    

for batch_ids in self.batcher(redis_node.scan_iter('V*'), self.SCAN_SIZE):
    redis_node_pipeline = redis_node.pipeline()
    for id in batch_ids:
        redis_node_pipeline.evalsha(sha, 1, id)

    responses = redis_node_pipeline.execute()

Tags: 命令selfredisnodehostforexecutepipeline
1条回答
网友
1楼 · 发布于 2024-06-02 23:47:29

经过一些调试后,我发现客户机库redispy在创建管道时使用了一个参数transaction=True

它尝试将管道中的所有命令作为事务执行。如果它试图将其作为事务执行,它将尝试检查所有命令中涉及的键是否散列到同一个插槽,因此它给出了crosslot错误

如果您想在没有事务的情况下使用redis管道,您应该这样做

redis_node_pipeline = redis_node.pipeline(transaction=False)

相关问题 更多 >