scrapy_redis配置redis集群

单节点的redis太容易挂了,总是出现意外情况,借助scrapy-redis-sentinel库实现scrapy_redis对redis集群的使用

按照官方库的说明去修改后启动项目会报错,报错的原因其实是作者的源码包中一个叫queue.py的文件中PriorityQueue类有一些逻辑上的问题
在这里插入图片描述
1、首先安装库

pip3 install scrapy-redis-sentinel

2、安装后修改queue.py源码

pip3 show scrapy-redis-sentinel   #查看源码包路径

在这里插入图片描述
进入包路径内

cd /usr/local/lib/python3.6/dist-packages/scrapy_redis_sentinel

在这里插入图片描述
修改queue.py中PriorityQueue类

class PriorityQueue(Base):
    """Per-spider priority queue abstraction using redis' sorted set"""

    def __len__(self):
        """Return the length of the queue"""
        return self.server.zcard(self.key)

    def push(self, request):
        """Push a request"""
        data = self._encode_request(request)
        score = -request.priority
        # We don't use zadd method as the order of arguments change depending on
        # whether the class is Redis or StrictRedis, and the option of using
        # kwargs only accepts strings, not bytes.
        self.server.execute_command("ZADD", self.key, score, data)

    def pop(self, timeout=0):
        """
        Pop a request
        timeout not support in this queue class
        """
        if not isinstance(self.server, RedisCluster):
            # use atomic range/remove using multi/exec
            pipe = self.server.pipeline()
            pipe.multi()
            pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)
            results, count = pipe.execute()
            if results:
                return self._decode_request(results[0])

        # 使用集群的时候不能使用 multi/exec 来完成一个事务操作;使用lua脚本来实现类似功能
        pop_lua_script = """
        local result = redis.call('zrange', KEYS[1], 0, 0)
        local element = result[1]
        if element then
            redis.call('zremrangebyrank', KEYS[1], 0, 0)
            return element
        else
            return nil
        end
        """
        script = self.server.register_script(pop_lua_script)
        results = script(keys=[self.key])
        if results:
            return self._decode_request(results)


修改完成后保存退出,其实就是把原来的else去掉了把if往后缩进了
3、修改settings.py配置文件,我就截图下需要修改的地方
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4、修改spider文件
在这里插入图片描述
5、启动项目
在这里插入图片描述
scrapy_redis配置redis集群成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值