返回介绍

12.4 Redis

发布于 2024-02-05 21:13:20 字数 2816 浏览 0 评论 0 收藏 0

Redis是一个使用ANSI C编写的高性能Key-Value数据库,使用内存作为主存储,内存中的数据也可以被持久化到硬盘。

在Python中可以使用第三方库redis-py访问Redis数据库,使用pip安装redis-py:

$ sudo pip install redis

下面是使用redis-py将数据写入Redis数据库的简单示例:

import redis

# 连接数据库
r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 创建3 条数据
person1 = {
 'name': '刘硕',
 'age': 34,
 'sex': 'M',
}

person2= {
 'name': '李雷',
 'age': 32,
 'sex': 'M',
}

person3= {
 'name': '韩梅梅',
 'age': 31,
 'sex': 'F',
}

# 将3 条数据以Hash 类型(哈希)保存到Redis中
r.hmset('person:1', person1)
r.hmset('person:2', person2)
r.hmset('person:3', person3)

# 关闭连接
r.connection_pool.disconnect()

Redis是Key-Value数据库,一项数据在数据库中就是一个键值对,存储多项同类别的数据时(如Book),通常以item:id这样的形式作为每项数据的键,其中的“:”并没有什么特殊,也可以换成“-”或“/”等,只是大家习惯这样使用。

仿照SQLitePipeline实现RedisPipeline,代码如下:

import redis
from scrapy import Item

class RedisPipeline:
 def open_spider(self, spider):
   db_host = spider.settings.get('REDIS_HOST', 'localhost')
   db_port = spider.settings.get('REDIS_PORT', 6379)
   db_index = spider.settings.get('REDIS_DB_INDEX', 0)

   self.db_conn = redis.StrictRedis(host=db_host, port=db_port, db=db_index)
   self.item_i = 0

 def close_spider(self, spider):
   self.db_conn.connection_pool.disconnect()
def process_item(self, item, spider):
 self.insert_db(item)

 return item

def insert_db(self, item):
 if isinstance(item, Item):
  item = dict(item)

 self.item_i += 1
 self.db_conn.hmset('book:%s' % self.item_i, item)

解释上述代码如下:

open_spider方法在开始爬取数据之前被调用,在该方法中通过spider.settings对象读取用户在配置文件中指定的数据库,然后建立与数据库的连接,将得到的连接对象赋值给self.db_conn,以便之后使用,并初始化一个self.item_i作为每项数据的id。在插入一项数据时,使用self.item_i自加的结果构造数据在数据库中的键。

process_item方法处理爬取到的每一项数据,在该方法中调用insert_db方法执行数据库的插入操作,在insert_db方法中先将一项数据转换成字典,然后调用hmset方法将数据以Hash类型存入Redis数据库。

close_spider方法在爬取完全部数据后被调用,在该方法中关闭与数据库的连接。

在配置文件settings.py中指定我们所要使用的Redis数据库,并启用RedisPipeline:

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_DB_INDEX = 0

ITEM_PIPELINES = {
  'toscrape_book.pipelines.RedisPipeline': 404,
}

运行爬虫,并查看数据库:

$ scrapy crawl books
$ redis-cli
127.0.0.1:6379> KEYS book:*
  1) "book:470"
  2) "book:300"
  3) "book:801"
  4) "book:476"
  5) "book:914"

 ...省略中间输出...

 995) "book:703"
 996) "book:407"
 997) "book:995"
 998) "book:569"
 999) "book:298"
1000) "book:110"
127.0.0.1:6379> HGETALL book:1
 1) "price"
 2) "\xc2\xa351.33"
 3) "review_rating"
 4) "2"
 5) "review_num"
 6) "0"
 7) "name"
 8) "Libertarianism for Beginners"
 9) "stock"
10) "19"
11) "upc"
12) "a18a4f574854aced"
127.0.0.1:6379> HGETALL book:2
 1) "price"
 2) "\xc2\xa317.46"
 3) "review_rating"
 4) "5"
 5) "review_num"
 6) "0"
 7) "name"
 8) "Set Me Free"
 9) "stock"
10) "19"
11) "upc"
12) "ce6396b0f23f6ecc"

结果表明,我们成功地将1000条数据存储到了Redis数据库。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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