Redis队列
约 1122 字大约 4 分钟
2025-01-11
介绍
Redis模式是基于Redis实现的任务队列管理方式。Redis 是一个高性能的内存键值数据库,支持丰富的数据结构(如列表、集合、有序集合),非常适合用作消息队列,具有高效、稳定、易扩展的特点。
特点与优势
高性能
:Redis 基于内存操作,读写速度极快,能够支撑高并发的爬虫任务调度。持久化支持
:支持 RDB 和 AOF 持久化机制,即使服务器重启也能恢复任务队列。分布式扩展
:支持多节点分布式部署,多个爬虫节点可以同时消费队列中的任务,实现任务的负载均衡。丰富的数据结构
:利用 Redis 的 List(列表)和 Sorted Set(有序集合)可以方便地实现任务队列和优先级调度。任务重试机制
:结合队列特性(如阻塞队列)和过期机制,方便实现任务重试和失败处理。
使用场景
中大型爬虫项目
:需要高并发和高吞吐量的爬虫任务。分布式爬虫
:需要多节点协作、动态扩展的任务分发系统。任务优先级调度
:对不同优先级任务有调度需求的场景。断点续爬
:需要在爬虫中断后继续执行未完成任务。
限制与挑战
内存消耗大
:Redis 主要基于内存,任务量过大时需考虑内存扩容或数据持久化。数据持久化风险
:虽然支持持久化,但若配置不当(如AOF策略不合理),可能导致数据丢失。额外部署成本
:需要安装和维护 Redis 服务器。
创建方式
你可以在创建项目时创建第一个任务的时候直接选择 Redis 模式的爬虫,也可以使用 generator.py
模块新建爬虫时选择 Redis 模式的爬虫
使用 generator.py
模块创建
generator.py
# -*- coding: utf-8 -*-
# @Author: yuanshaohang
# @Date: 2020-02-23 09:56:50
# @Version: 1.0.0
# @Description: 创建爬虫
from hunterx.utils.generator import production
# spider_dir: 爬虫分层目录名称(路径不存在时会自动创建,无需手动创建目录)
# spider_name: 创建的爬虫名称
# kernel_code: 需要使用的核心引擎 默认优先使用内存优先级队列,默认为3(内存队列),1为rabbitmq队列,2为redis队列
production(spider_name='redis_spider', kernel_code=2)
这样执行后就会在 spiders
目录下创建一个名为 redis_spider.py
的爬虫文件,并且该爬虫使用的是 Redis优先级队列
模式,这个模式下你需要进行一些配置
setting配置
主要配置部分是对 settings.py
中 Redis连接部分参数的配置
- 配置示例
settings.py
# ------------------ redis连接配置参数 ------------------#
# redis地址
REDIS_HOST_LISTS = [{'localhost': 6379}] # port注意是数字类型
# redis用户名和密码,没有密码不用设置
REDIS_ACCOUNT = {
'username': '',
'password': ''
}
# 是否开启redis连接
REDIS_ENABLED = True
# 是否启用去重模式(仅redis队列可用)
FILTER = False
提示
一定要注意 REDIS_ENABLED
参数是否开启,否则即使配置了连接地址也不会进行连接
使用示例
编辑 redis_spider.py
文件为以下内容
redis_spider.py
# -*- coding: utf-8 -*-
import hunterx
from hunterx.spiders import RedisSpider
class RedisSpiderSpider(RedisSpider):
name = 'rabbitmq_spider'
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
def start_requests(self):
for i in range(100):
url = 'https://www.baidu.com/'
yield hunterx.Requests(url=url, headers=self.header, callback=self.parse, level=1)
async def parse(self, response):
print(f'parse 接收到的response: {response.status_code}')
for i in range(100):
url = 'https://www.baidu.com/'
yield hunterx.Requests(url=url, headers=self.header, callback=self.height_level, level=2)
async def height_level(self, response):
print(f'height_level 接收到的response: {response.status_code}')
if __name__ == '__main__':
start_run = RedisSpiderSpider()
start_run.run()
可以看到除了爬虫类继承的父类不同以外,其他使用方式依旧与另外两种队列模式并无二致
优先级分解说明
参考 内存队列
优先级分解说明
总结
Redis模式是爬虫框架中高性能、高扩展性、高可靠性的队列实现方式,特别适合分布式、多节点协作的爬虫项目。借助 Redis 的灵活数据结构,能够轻松实现任务调度、优先级控制和去重功能。
它是比内存模式更可靠、比 RabbitMQ 更全面的解决方案,适合对性能和扩展性有较高要求的中大型爬虫项目。