16.1 Redis 基础
使用Scrapy打造分布式爬虫,首先要了解Redis的基础知识,在分布式爬虫中,Redis处于非常关键的地位。
16.1.1 Redis简介
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis有以下特点:
·支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候再次加载进行使用。
·不仅支持简单的key-value类型的数据,同时还提供list、set、sorted set、hash等数据结构的存储,因此也被称为数据结构服务器。
·支持master-slave模式的数据备份。
Redis是现在非常流行的Key-Value数据库,相比其他的Key-Value数据库,优势明显,主要包括以下方面:
·基于内存,性能极高。Redis读的速度是110000次/秒,写的速度是81000次/秒。
·支持丰富的数据结构。
·具有丰富的特性,比如支持publish/subscribe、通知、key过期等。
16.1.2 Redis的安装和配置
1.Redis的安装
对于Redis安装,主要讲解Linux和Windows平台。Redis官方下载地址为:https://redis.io/download ,如图16-1所示。
图16-1 Redis官网
选择下载Stable下的源码包,本书用的版本是3.2.5。将源码包下载下来进行解压和编译:
$ wget http://download.redis.io/releases/redis-3.2.5.tar.gz $ tar xzf redis-3.2.5.tar.gz $ cd redis-3.2.5 $ make
编译效果如图16-2所示。
编译成功后,进入src目录下,执行./redis-server命令,即可启动Redis服务。Redis服务端的默认连接端口是6379,启动效果如图16-3所示。
Redis官方不支持Windows版,Windows版是由Microsoft Open Tech group小组维护,并在GitHub上发布了Win64版,下载地址如下:
https://github.comMSOpenTech/redis/releases
我们直接下载免安装版,如图16-4所示。
图16-2 编译Redis
图16-3 启动Redis
图16-4 Win64版
将压缩包解压,并进入其中,有如下文件:
·EventLog.dll
·Redis on Windows Release Notes.docx
·Redis on Windows.docx
·redis-benchmark.exe
·redis-benchmark.pdb
·redis-check-aof.exe
·redis-check-aof.pdb
·redis-cli.exe
·redis-cli.pdb
·redis-server.exe
·redis-server.pdb
·redis.windows-service.conf
·redis.windows.conf
·Windows Service Documentation.docx
双击redis-server.exe即可以运行Redis服务,效果如图16-5所示。
图16-5 启动redis-server
最好将redis-server.exe添加到Path环境变量中,之后就可以在命令行中快速启动服务。
2.Redis的配置
无论是Linux版还是Windows版,Redis里面都有一个配置文件。Linux下的配置文件为redis.conf,和src在同一级目录下,Windows下的配置文件为redis.windows.conf。在使用redis-server启动服务的时候,可以在命令后面指定配置文件,类似如下的情况:
redis-server redis.conf
Redis配置文件的可用参数如表16-1所示。
表16-1 配置参数
16.1.3 Redis数据类型与操作
Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及sorted set(有序集合)。
1.string类型
string是Redis最基本的类型,一个key对应一个value。string类型可以包含任何数据,比如jpg图片或者序列化的对象。从内部实现来看,其实string可以看作byte数组,是二进制安全的,一个键最大能存储512MB。
下面我们在Redis客户端中进行操作,使用redis-cli命令连接Redis服务,语法格式为:redis-cli-h host-p port-a password。如果Redis服务在本机运行,而且无密码,可以直接在命令行中输入:redis-cli,如图16-6所示。
图16-6 连接redis-server
下面使用set和get操作string类型数据,示例如下:
127.0.0.1:6379> set name qiye OK 127.0.0.1:6379> get name "qiye" 127.0.0.1:6379>
以上示例使用了Redis的set和get命令。键为name,对应的值为qiye。
2.hash类型
Redis的hash类型是一个string类型的field和value的映射表,特别适合用于存储对象。相较于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便地存取整个对象。每个hash可以存储232 -1个键值对,大约40多亿条。下面使用hset、hget、hmset、hmget命令进行操作,示例如下:
127.0.0.1:6379> hset person name qiye (integer) 1 127.0.0.1:6379> hget person name "qiye" 127.0.0.1:6379> hmset student name qiye age 20 country china OK 127.0.0.1:6379> hmget student age 1) "20" 127.0.0.1:6379> hmget student names 1) (nil) 127.0.0.1:6379>
以上示例中,使用Redis的hset设置了key为person、field为name、value为qiye的hash数据,hmset可以设置多个field的值。
3.list类型
list类型是一个双向键表,其每个子元素都是string类型,最多可存储232 -1个元素,大约40多亿,可以使用push、pop操作从链表的头部或者尾部添加删除元素,操作中key可以理解为链表的名字。下面使用lpush和lrange命令进行操作,示例如下:
127.0.0.1:6379> lpush country china (integer) 1 127.0.0.1:6379> lpush country USA (integer) 2 127.0.0.1:6379> lpush country UK (integer) 3 127.0.0.1:6379> lrange country 0 10 1) "UK" 2) "USA" 3) "china"
以上示例中使用lpush往country中添加了china、USA、UK等值,使用lrange从指定起始位置取出country中的值。
4.set类型
set是string类型的无序集合,最大可以包含232 -1个元素,约40多亿。对集合可以添加删除元素,也可以对多个集合求交并差,操作中key可以理解为集合的名字。set通过hash table实现,添加、删除和查找的复杂度都是O(1)。hash table会随着添加或者删除自动调整大小。下面使用sadd和smembers命令进行操作,示例如下:
127.0.0.1:6379> sadd url www.baidu.com (integer) 1 127.0.0.1:6379> sadd url www.google.com (integer) 1 127.0.0.1:6379> sadd url www.qq.com (integer) 1 127.0.0.1:6379> sadd url www.qq.com (integer) 0 127.0.0.1:6379> smembers url 1) "www.baidu.com" 2) "www.qq.com" 3) "www.google.com"
以上示例通过sadd添加了四次数据,重复的数据是会被忽略的,最后通过smembers获取url中的值,只有三条数据,这就可以使用set类型进行URL去重。
5.sorted set类型
和set一样,sorted set也是string类型元素的集合,不允许重复的成员。sorted set算是set的升级版本,它在set的基础上增加了一个顺序属性,会关联一个double类型的score。这一属性在添加和修改元素的时候可以指定,每次指定后,sorted set会自动重新按新的值调整顺序。sorted set成员是唯一的,但score却可以重复。下面使用zadd和zrangebyscore命令进行操作,示例如下:
127.0.0.1:6379> zadd web 0 flask (integer) 1 127.0.0.1:6379> zadd web 1 web.py (integer) 1 127.0.0.1:6379> zadd web 2 django (integer) 1 127.0.0.1:6379> zadd web 3 flask (integer) 0 127.0.0.1:6379> zrangebyscore web 0 5 1) "web.py" 2) "django" 3) "flask"
以上示例通过zadd添加了四次数据,重复的数据是会被忽略的,最后通过zrangebyscore根据score范围获取web中的值。
通过以上内容的学习,大家已经了解了Redis的基本用法,Redis还有很多命令和用法,大家感兴趣的话,可以去Redis中文网:http://www.redis.net.cn/ 进行学习。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论