Python分布式任务队列RQ 0.12.0与redis-py 3.0.0+不兼容问题如何解决

会遇到这个错误:

AttributeError: 'int' object has no attribute 'items'

今天在一台新机器上给 V2EX 构建开发环境的 Docker 镜像时发现的。解决方法是指定 redis-py 的版本:

redis==2.10.6

Python分布式任务队列RQ 0.12.0与redis-py 3.0.0+不兼容问题如何解决
2 回复

这个问题我遇到过,确实挺烦人的。RQ 0.12.0用的是redis-py 2.x的API,而redis-py 3.0.0做了不兼容的改动。

最简单的解决方案是降级redis-py:

pip install redis==2.10.6

或者升级RQ到支持redis-py 3.x的版本:

pip install rq>=1.0

如果你必须用redis-py 3.x和RQ 0.12.0,可以试试这个猴子补丁:

import redis
from redis import Redis
from rq.connections import Connection

# 修复redis-py 3.x的兼容性问题
class PatchedRedis(Redis):
    def __init__(self, *args, **kwargs):
        # 确保使用正确的连接池参数
        kwargs.setdefault('decode_responses', False)
        super().__init__(*args, **kwargs)
    
    # 修复zrangebyscore方法
    def zrangebyscore(self, name, min, max, start=None, num=None, 
                     withscores=False, score_cast_func=float):
        return super().zrangebyscore(name, min, max, start=start, 
                                    num=num, withscores=withscores, 
                                    score_cast_func=score_cast_func)

# 替换默认的Redis连接
Connection.redis_class = PatchedRedis

不过说实话,最好还是直接升级RQ到1.x版本,那个版本已经官方支持redis-py 3.x了。

版本兼容问题,升级或降级选一个就行。


celery4.0 和 redis-py3.0 也不兼容,推荐版本 redis==2.10.6

回到顶部