如何解决当我每个 evalsha 只发送一个密钥时,为什么 redis 管道会出现跨槽错误?
我正在使用 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()
解决方法
经过一些调试,我发现客户端库 redis-py,在创建管道时,接受一个参数 transaction=True
它尝试将管道中的所有命令作为一个事务执行。如果它试图将它作为交易执行,它将尝试检查所有命令中涉及的键是否散列到同一个槽,因此它给出了交叉错误。
如果你想在没有事务的情况下使用redis管道,你应该这样做
redis_node_pipeline = redis_node.pipeline(transaction=False)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。