第9章-Redis介绍

一、Redis简介

  • Redis是一种⾮关系型数据库,是一个开源的、C语⾔开发的、键值对存储数据的nosql数据库。
  • Rdis是一种缓存型数据库(快速存取),但⽀持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进⾏使⽤
  • Redis使用:
    (1)官⽹地址:https://redis.io/
    (2)命令地址:http://doc.redisfans.com/
  • Redis的五⼤数据类型:string/list/set/hash/zset

二、Redis的简单应用

需要打开2个cmd窗口,现在第一个窗口中开启redis-server,再在第二个窗口中开启redis-client:
在这里插入图片描述
在这里插入图片描述
redis的配置文件redis.windows.conf(位于安装文件的下面),可以通过pycharm打开(直接拖到pycharm中即可)

redis命令不区分大小写,可以用tab键补全:

  • DBSIZE 查看当前数据库的key数量
  • keys * 查看key的内容
  • FLUSHDB 清空当前数据库的key的数量
  • FLUSHALL 清空所有库的key(慎⽤)
  • exists key 判断key是否存在
  • select [num] 选择数据库db,默认为0,最多有16个,通常1个db足够保存下载的数据

三、redis常⽤五⼤数据类型

注意:在查看某项数据时,需要先通过type [key]确定key的类型,再选择合适类型的方法进行操作

3.1 string

string是redis最基本的类型,⼀个key对应⼀个value;string可以包含任何数据,最⼤不能超过512M
set ---- 设置值
get ---- 获取值
mset ---- 设置多个值
mget ---- 获取多个值
append ---- 添加字段
del ---- 删除
strlen ---- 返回字符串⻓度
incr ---- 增加
decr ---- 减少
incrby ----- 制定增加多少
decrby ----- 制定减少多少
getrange ---- 获取指定区间范围内的值,类似between…and的关系,从0 -1表示全部
setrange ---- 代表从第⼏位开始替换,下脚本从零开始,从0 -1表示全部

3.2 list

列表是简单的字符串列表,按照插⼊顺序排序,可以添加⼀个元素列表的头部(左边)或者尾部(右边),它的底层实际是个链表
lpush/rpush/lrange ---- 从左/从右/获取指定⻓度
lpop/rpop ---- 移除最左/最右
lrange/lindex----按照索引下标获得元素
llen----求列表⻓度
lrem ----删N个value
ltrim ---- 开始index结束index,截取指定范围的值后在赋值给key
rpoplpush list1 list2 将list1中最后⼀个压⼊list2中第⼀位
lset list01 0 x---- 将list02中第⼀位换成x
linsert list01b before/after x php---- 在x之前/后加字段php

3.3 hash

hash是⼀个键值对集合,是⼀个string类型的field和value的映射表,hash特别适合存储对象
hset/hget/hmset/hmget/hgetall/hdel----设值/取值/设值多个值/取多个值/取全部值/删除值
hlen----求哈希⻓度
hexists ---- 在key⾥⾯的某个值
hkeys/hvals

3.4 set

set是string类型的⽆序集合,不重复的
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
scard ---- 获取集合⾥⾯的元素个数
srem ---- 删除集合中元素
srandmembe ---- 随机出⼏个数
spop ---- 随机出栈
smove set01 set03 2 将set01中的2 移动到set03中

3.5 Zset

zset为有序集合,存储的内容为num和string对,且num必须在string的前面
例如:
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrem zset01 v1

四、python操作redis

通过python连接redis,前提是server先要开启,client可不用开启

import redis

class RedisString():
    def __init__(self):
        # 连接redis,前提是server先要开启;decode_responses=True可以使返回的数据为string,否则返回<class 'bytes'>
        self.r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)

    def string_set(self, k, v):
        res1 = self.r.set(k, v)
        print(res1)

    def string_key(self):
        print(self.r.keys('*'))

    def string_get(self, k):
        res2 = self.r.get(k)
        return res2


if __name__ == '__main__':
    s = RedisString()
    print(s.string_key())
    print('*' * 50)
    s.string_set('job', 'engineer')
    print(s.string_key())
    print('*' * 50)
    res3 = s.string_get('job')
    print(res3)
    print(type(res3))

控制台打印数据:
在这里插入图片描述

五、scrapy_redis

集群:多个程序并行做相同的事情
分布式:多个程序并行做不同的事情,分布式可以利用多台电脑的带宽和能力,加快爬取

  • scrapy:不支持分布式,但支持主从同步、数据库集群
  • scrapy_redis:基于redis的scrapy组件,支持分布式策略,redis支持高频读写,负责scrapy中数据的同步和去重【redis中有:redis_key=‘myspider:start_urls’(初始的URL)、items(要保存的数据(yield到redis中))、requests(待爬取的对象)、dupefilter(爬取过的对象)】

spider从redis queue中读取urls
在这里插入图片描述
将scrapy改写为scrapy_redis的方法:
第1步:在spider.py中导入模块:

from scrapy_redis.spiders import RedisSpider

第2步:将scrapy爬虫中的父类改写为:

RedisSpider

第3步:把start_urls改写为redis_key:

redis_key = [spider name]

第4步:在redis-client中将start_url写到spider name的列表中:

lpush  [spider name] start_urls

第5步:修改配置文件:

1)复制过滤器和队列代码到settings中:
# 为request对象指定去重过滤器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 为scheduler指定队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True2)在settings中打开pipelines并添加redis数据存储方法:
ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    # 将爬取的数据存储到redis中
    'scrapy_redis.pipelines.RedisPipeline': 400,
}3)在settings中关闭LOG_LEVEL = 'WARNING'

在这里插入图片描述

六、扩展

通过列表推导式处理格式问题:
item[‘b_cate’] = [i.strip() for i in item[‘b_cate’] if len(i.strip())>0]
strip()去掉空格,包含/r ,/n等
条件if len(i.strip())>0与列表推导式合用,去除空的序列值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值