微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决当我每个 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 举报,一经查实,本站将立刻删除。