返回介绍

16.1 Redis 基础

发布于 2024-01-26 22:39:51 字数 6511 浏览 0 评论 0 收藏 0

使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文