🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
多台服务器执行一个大型任务,就会有某一个小任务重复问题,比如服务器1下载了 http://www.baidu.com/test.png 这张图片,如果不去重则服务器2也会下载这张图片。 <br/> scrapy_redis通过将 url 放在一个Redis数据库的 list 数据类型中,并将这个Redis数据库与所有相关的服务器共享,当服务器1的任务是下载 http://www.baidu.com/test.png 这张图片,则将 http://www.baidu.com/test.png 从Redis数据库的 list 删除(pop),所以其它服务器就不会重复执行这个任务了。 ![](https://img.kancloud.cn/c4/eb/c4ebbf820b755e97adedaae7addb22a9_1236x585.jpg) 1. 分布式爬虫可以有任意个节点,但是始终只有一个Redis数据库; 2. 三个服务器通过调度器将url放入集合中去重,如果集合中判断该url还没有被执行,则将这个url放入任务队列中等待执行;如果已被执行,则该url被忽略; 3. 数据队列:这个可有可无,它存在的目的是方便不同服务器将数据保存到同一个Redis数据库,这个数据队列就是我们任务的总数; 4. 资源分配:分配策略就是抢占,三个服务器根据自身速度抢占任务,谁先抢到这个任务就由谁执行。