今天分享一下Scrapy_redis分布式原理:
1 scrapy_redis是什么
Scrapy_redis : Redis-based components for Scrapy.
Github地址:<https://github.com/rmax/scrapy-redis>
在这个地址中存在三个demo,后续我们对scrapy_redis的使用会通过这三个demo展开
2 为什么要学习scrapy_redis
Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:
- 请求对象的持久化
- 去重的持久化
- 和实现分布式
3 scrapy_redis的原理分析
3.1 回顾scrapy的流程
那么,在这个基础上,如果需要实现分布式,即多台服务器同时完成一个爬虫,需要怎么做呢?
3.2 scrapy_redis的流程
- 在scrapy_redis中,所有的带抓取的对象和去重的指纹都存在所有的服务器公用的redis中
- 所有的服务器公用一个redis中的request对象
- 所有的request对象存入redis前,都会在同一个redis中进行判断,之前是否已经存入过
- 在默认情况下所有的数据会保存在redis中
具体流程如下:
4 对于redis的复习
很多人对redis的命令遗忘的差不多了, 但是在scrapy_redis中需要使用redis的操作命令,所有需要回顾下redis的命令操作
4.1 redis是什么
redis是一个开源的内存型数据库,支持多种数据类型和结构,比如列表、集合、有序集合等,同时可以使用redis-manger-desktop等客户端软件查看redis中的数据,关于redis-manger-desktop的使用可以参考扩展阅读
4.2 redis服务端和客户端的启动
- `/etc/init.d/redis-server start` 启动服务端
- `redis-cli -h <hostname> -p <端口号>` 客户端启动
4.3 redis中的常见命令
1. `select 1` 切换db
1. `keys *` 查看所有的键
1. `tyep 键` 查看键的类型
1. `flushdb` 清空db
1. `flushall` 清空数据库
4.4 redis命令的复习
redis的命令很多,这里我们简单提及一下后续会使用的命令:
列表:
LPUSH mylist "world" >向mylist从左边添加一个值
LRANGE mylist 0 -1 >返回mylist中所有的值
LLEN mylis >返回mylist的长度
set:
redis> SADD myset "Hello" >往set中添加数据
SMEMBERS mysetredis> >获取myset中所有的元素
redis>SCARD myset >scrad 获取数量
zset:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
10
3"two"
4)121
5"three"
6)131
redis> ZCARD myzset
zadd 向一个zset中添加一个值和分数,如果存在值就更新分数,分数可以相同zrange 遍历myzesetzcard 返回zset中元素的数量