我正在使用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()
经过一些调试后,我发现客户机库redispy在创建管道时使用了一个参数transaction=True
它尝试将管道中的所有命令作为事务执行。如果它试图将其作为事务执行,它将尝试检查所有命令中涉及的键是否散列到同一个插槽,因此它给出了crosslot错误
如果您想在没有事务的情况下使用redis管道,您应该这样做
相关问题 更多 >
编程相关推荐