redis初识

最近写了一个爬虫,想对它优化一下,就想到了可以使用scrapy + redis实现一个分布式爬虫,今天就学习学习redis。

一 Redis简介

redis是一个高性能的key-value数据库,它是将数据存储在内存当中,因此相对而言比较快速,且性能极高。

与其它的key-value数据库相同的是:
1.支持数据的持久化,重启的时候数据可以再次加载使用;
2.不仅仅支持key-value类型的数据,还支持list,set,zset,hash等数据结构;
3.支持数据备份
不同点:
1.redis有着更为复杂的数据结构并且提供对它们的原子性操作;
1.redis运行在内存中但是可以持久化到磁盘所以说数据量不能大于硬件内存;相比在磁盘上相同的复杂的数据结构,在内存中操作起来相对简单。

Redis数据类型
支持五种数据类型:string(字符串),hash(哈希),list,set,zset(有序集合)
string类型是二进制安全的,也就是string可以包含任何数据;
hash是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象;
list是一个简单的字符串列表,按照插入顺序排序;
set是string类型的无序集合集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。使用sadd命令添加一个string元素到key,对应的set集合中,成功则返回1,如果元素已经在集合中则返回0;
zset和set不同的是每个元素都会关联一个double类型的分数,redis通过分数来为集合中的成员进行从小到大的排序。添加元素的命令是zadd命令。

Redis键(key)
redis键命令的基本语法是:COMMAND KEY_NAME

Redis HyperLogLog
用来做基数统计的算法,优点是当输入元素的数量或提及非常非常大时,计算基数所需的空间很小。
基数?对于数据集{1,3,5,7,5,7,8}的基数集是{1,3,5,7,8},基数为5。技术就是在误差可接受的范围内,快速计算基数。
所用到的命令如下:
PFADD:添加指定元素到HyperLogLog中
PFCOUNT:返回给定HyperLogLog的技术估算值
PFMERGE:将多个HyperLogLog合并为一个

二  关于分布式爬虫

redis如何实现爬虫分布式的中心:将所有爬虫获取到的url都放到一个redis queue中,并且所有的爬虫都从单个的redis queue中获取request。爬虫默认的是广度优先搜索,假定现在有两个爬虫,那么是如何实现分布式,具体的步骤如下:

首先运行爬虫A,爬虫引擎请求spider A中的start_urls中的链接并交割给调度器,进而引擎向调度器请求爬取的url并交给下载器下载,下载后的response交给spider,spider根据定义的rules得到链接,继续通过引擎交给调度器。
进而启动B,B的start_urls首先交给和A中的调度器相同的,而B的引擎请求爬取url时,调度器调度给B下载的url还是A中没下载完的url,这时A和同时下载A中未完成的链接,待完成后,同时下载B的要求链接。
在scrapy-redis中默认使用的是SpiderPriorityQueue方式,这是由sorted set实现的一种非FIFO,LIFO方式。

每次执行重新爬取时,应该将redis中存储的数据清空,否则会影响爬虫现象。

request和url的区别:request是由spider完成,spider会返回request给scrapy引擎进而交割调度器.url也是在spider中定义或由spider获取

在scrapy中crawler是包含spider的,scrapy的架构就是spider,spider的作用是提供start_url,根据下载到的response分析获取想要的内容继续提取url。

如果使用Python+redis+其它数据库实现分布式爬虫存储数据,其中的redis只用作url的存储,不关乎爬虫得到的具体数据,设置slave上的scrapy-redis获取url的地址为master地址,尽管有多个slave,然而获取url只能从服务器上的redis数据库。并且,由于scrapy-redis自身的队列机制,slave获取的链接不会相互冲突。各个slave在完成抓取任务之后,将结果汇总到服务器上(这时的存储不再是redis,可以是mongodb或者mysql等)

对于已有的scrapy程序,扩展分布式程序步骤如下:
1.找一台高性能服务器,用于redis队列的维护以及数据的存储;
2.扩展scrapy程序,让其通过服务器的redis来获取start_urls,并改写pipeline里数据存储部分,把存储地址改为服务器地址。
3。在服务器上写一些生成url的脚本,并定期执行。

防抓取屏蔽的方法
1.设置download_delay,但会降低爬虫效率;
2.随机生成user_agent,或者重写middleware,让程序每次运行都可以随机获取user_agent;
3.设置代理ip池;
4.设置好header里的domian和host

关于使用随机user-agent的方法
在settings.py中添加如下代码:
DOWNLOADER_MIDDLEWARES = {
‘scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware‘ : None,
‘Crawler.comm.rotate_useragent.RotateUserAgentMiddleware‘ :400
}

相应的在对应的爬虫代码中添加一个user-agent的列表如下:
user_agent_list = [\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"\
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",\
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",\
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",\
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",\
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",\
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

时间: 2024-10-25 16:19:45

redis初识的相关文章

Redis初识、设计思想与一些学习资源推荐

一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年3 月15 日起,Redis 的开发工作由VMware 主持. Redis 是一个Key-Value 存储系统.和Memcached 类似,它支持存储的value 类型相对更多, 包括string(字符串).hash(散列).list(链表).set(集合)和zset(有序集合).这些数据类型支持p

Redis初识:安装

近期突然要用到Redis,对于此君以前也之只是耳闻,没有用过,现在的技术更新实在太快,每年都会出现很多新技术,学无止境啊-- 起因 首先简单说下Redis的概念.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set –有序集合)和hash(哈希类型). 在没了

redis初识01

一.Redis简介 1.1 Redis是什么 REmote DIctionary Server(Redis) 是一个key-value存储系统. 1.2 Redis优点 性能极高 – Redis能支持超过 100K+ 每秒的读写频率. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作. 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行. 丰富的特性 –

redis 初识与安装

一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的values类型相对更多,包括字符串.列表.哈希散列表.集合,有序集合. 这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现

在python中使用redis 初识

一.下载redis模块 pip3 install -i https://pypi.douban.com/simple redis 二.创建单连接 import redis # 创建链接 conn = redis.Redis(host='192.168.64.129', port=6379, password='@WSX3edc') # 设置值,以字典的形式 conn.set('k1', 'v1') # 获取值 字典 val = conn.get('k1') print(val) print(st

C# - ServiceStack.Redis

最近看了一点Redis的东西:Redis初识,见识到Redis的强大.纸上得来终觉浅,绝知此事要躬行,本文借鉴参考:.NET中使用Redis 自己去实现一个简单的Blog Demo,目的: 熟悉Redis的基本知识: 应用C#-Redis的常用组件:ServiceStack.Redis: 用户(User)可以注册一个博客(Blog),然后可以在博客上面写文章(Post),文章可以分类(Category)以及添加标签(Tag),用户可以对文章进行评论(Comment). 一个Blog Demo应该

Redis从入门到高可用分布式布局实战教程

第1章 Redis初识 带领听众进入Redis的世界,了解它的前世今生.众多特性.应用场景.安装配置.简单使用,可以让听众对Redis有一个全面的认识. 第2章 API的理解和使用 全面介绍了Redis提供的5种数据结构字符串(string).哈希(hash).列表(list).集合(set).有序集合(zset)的数据模型.常用命令.典型应用场景.同时本章还会对Redis的单线程处理机制.键值管理做一个全面介绍,通过对这些原理的理解,听众可以在合适的应用场景选择合适的数据结构. ... 第3章

Redis从认识安装到实现增删改查

Redis从一无所知,到知道一点点 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库 --维基百科 可以简单的说,Redis就是一款高性能的NoSQL数据库 什么是NoSQL? 我们前面所学习的MySQL数据库是典型的的SQL数据库也就是传统的关系型数据库,而我们今天学习的Redis数据库则是一款NoSQL数据库,也叫作非关系型数据库,它与我们熟悉的MySQL等的概念完全是不一样的,它是一项全新的数据库理念,我们帖一组百度百科的解释 NoSQL,泛指非

Redis 初始

Redis初识 Redis是什么 开源 基于Key-Value的存储服务系统 多数据结构(string,hash,list,set,sorted set) 高性能.功能丰富 Redis的特性回顾 速度快 10w OPS 数据存储在内存 C语言(50000line) 线程模型 单线程 持久化(断电不丢数据) 多种数据结构 BitMaps 位图 HyperLogLog 超小内存唯一值计数 GEO 地址信息定位 支持多种编程语言 java php python ruby lua nodejs 功能丰富