目录
?
Scrapy框架进阶
Redis;
特性:
作用:
快速存取
应用场景:
Redis的安装与启动
Redis的配置文件
?Redis数据库简单使用
NoSQL和SQL数据库的比较
redispy安装及连接
Redis常用五大数据类型
Scrapy-分布式:
?
Scrapy框架进阶
redis是一个高性能,开源的,C语言开发的,键值对存储数据的nosql数据库。
Redis;
特性:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
- Redis支持数据的备份
作用:
快速存取
应用场景:
点赞/秒杀/直播平台的在线好友列表/商品排行榜
Redis的安装与启动
查看帮助命令
redis-server --help
启动服务
redis-server.exe
链接客户端
redis-cli.exe
Redis的配置文件
/etc/redis/redis.conf
当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
daemonize no
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
设置数据库的数目。
databases 16
根据给定的时间间隔和写入次数将数据保存到磁盘
下面的例子的意思是:
900 秒内如果至少有 1 个 key 的值变化,则保存
300 秒内如果至少有 10 个 key 的值变化,则保存
60 秒内如果至少有 10000 个 key 的值变化,则保存
save 900 1
save 300 10
save 60 10000
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
Redis默认只允许本地连接,不允许其他机器连接
bind 127.0.0.1
?Redis数据库简单使用
DBSIZE 查看当前数据库的key数量
keys * 查看key的内容
FLUSHDB 清空当前数据库的key的数量
FLUSHALL 清空所有库的key(慎用)
exists key 判断key是否存在
NoSQL: not only sql,泛指非关系型数据库 Redis/MongoDB/Hbase Hadoop
关系型数据库:MySQL、oracle、SqlServer
NoSQL和SQL数据库的比较
适用场景不同:SQL数据库适合用于关系特别复杂的数据查询场景,nosql反之
事务:SQL对事务的支持非常完善,而nosql基本不支持事务
两者在不断的取长补短
redispy安装及连接
安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)
?
Redis常用五大数据类型
1.redis-string:string是Redis最基本的类型,一个key对应y一个value(string可以包含任何数据,最大不能超过512M
set ---- 设置值
get ---- 获取值
mset ---- 设置多个值
mget ---- 获取多个值
append ---- 添加字段
del ---- 删除
strlen ---- 返回字符串长度
incr ---- 增加
decr ---- 减少
incrby ----- 制定增加多少
decrby ----- 制定减少多少
getrange ---- 获取指定区间范围内的值,类似between....and的关系
setrange ---- 代表从第几位开始替换,下脚本从零开始
从0 -1表示全部
redis-list(单值多value):最简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部或尾部,底层实际是个链表
lpush/rpush/lrange ---- 从左/从右/获取指定长度
lpush list01 1 2 3 4 5 倒序排列
rpush list02 1 2 3 4 5 正序排列
lrange list01 0 -1 获取list01 中的所有值
lpop/rpop ---- 移除最左/最右
lpop list01 删除元素5
rpop list01 删除元素1
lrange list01 0 -1
lindex list01 1
llen list01 #求列表长度
删N个value
lrem list01 2 1 在list01中删除2个1
ltrim ---- 开始index结束index,截取指定范围的值后在赋值给key
ltrim list01 0 2 截取list01 从0到2的数据在赋值给list01
lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2
lset list01 0 x 将list02中第一位换成x
linsert list01b before x php 在x之前加字段php
redis-Hash:hash是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合存储对象
?
求哈希长度
hlen customer
hexists ---- 在key里面的某个值
存在返回1 ,不存在返回0
hkeys students
hvals students
?redis-set(去重,无序)
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3 去掉重复添加
smembers set01 得到set01
sismember set01 1 如果存在返回1 不存在返回0
scard ---- 获取集合里面的元素个数
scard set01
srem key value:
srem ---- 删除集合中元素
srem set01 3
SMEMBERS set01 3已经被删除掉
srandmember Key:
srandmembe ---- 随机出几个数
sadd set02 1 2 3 4 5 6 7 8
srandmember set02 2
spop key:
spop ---- 随机出栈
spop set01
smove key1 key2:
sadd set03 x y z
smove set01 set03 2 将set01中的2 移动到set03中
数学集合类:
sadd set01 1 2 3 4 5
sadd set02 1 2 3 a b
差集
SDIFF set01 set02 返回 4 5 在第一个set中不在第二个set中
交集
SINTER set01 set02 返回 1 2 3
并集
SUNION set01 set02 返回set01 set02 中的值 去掉重复
redis-Zset(无序集合)
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
带分数返回 withscores
zrangebyscore key start end----根据开始结束来取值
zrangebyscore zset01 60 70
zrangebyscore zset01 60 (90 表示不包含90
zrangebyscore zset01 60 90 limit 1 2 从第一条开始截取2条
zrem key value---- 某score下对应的value值,作用是删除元素
zrem zset01 v1
zcard/zcount key score区间/zrank key values:
zcard 求zset01 总条数
zcount zset01 60 90 求60-90个数
zrank zset01 v2 返回1 返回对应下角标,从0开始
字符串相关操作:
import redis
class TestString(object):
def __init__(self):
self.r = redis.StrictRedis(host='192.168.75.130',port=6379)
设置值
def test_set(self):
res = self.r.set('user1','juran-1')
print(res)
取值
def test_get(self):
res = self.r.get('user1')
print(res)
设置多个值
def test_mset(self):
d = {
'user2':'juran-2',
'user3':'juran-3'
}
res = self.r.mset(d)
取多个值
def test_mget(self):
l = ['user2','user3']
res = self.r.mget(l)
print(res)
删除
def test_del(self):
self.r.delete('user2')
列表相关操作: ?
class TestList(object):
def __init__(self):
self.r = redis.StrictRedis(host='192.168.75.130',port=6379)
插入记录
def test_push(self):
res = self.r.lpush('common','1')
res = self.r.rpush('common','2')
# res = self.r.rpush('jr','123')
弹出记录
def test_pop(self):
res = self.r.lpop('common')
res = self.r.rpop('common')
范围取值
def test_range(self):
res = self.r.lrange('common',0,-1)
print(res)
集合相关操作:
class TestSet(object):
def __init__(self):
self.r = redis.StrictRedis(host='192.168.75.130', port=6379)
添加数据
def test_sadd(self):
res = self.r.sadd('set01','1','2')
lis = ['Cat','Dog']
res = self.r.sadd('set02',lis)
删除数据
def test_del(self):
res = self.r.srem('set01',1)
随机删除数据
def test_pop(self):
res = self.r.spop('set02')
哈希相关操作:?
class TestHash(object):
def __init__(self):
self.r = redis.StrictRedis(host='192.168.75.130', port=6379)
批量设值
def test_hset(self):
dic = {
'id':1,
'name':'huawei'
}
res = self.r.hmset('mobile',dic)
批量取值
def test_hgetall(self):
res = self.r.hgetall('mobile')
判断是否存在 存在返回1 不存在返回0
def test_hexists(self):
res = self.r.hexists('mobile','id')
print(res)
Scrapy-分布式:
scrapy-redis:
scrapy_redis:Redis-based components for scrapy
scrapy工作流程:
?scrapy_redis工作流程:
?scrapy_redis下载:
clone github scrapy_redis源码文件
git clone https://github.com/rolando/scrapy-redis.git
scrapy_redis运行:
allowed_domains = ['dmoztools.net']
start_urls = ['http://www.dmoztools.net/']
scrapy crawl dmoz
?运行结束后redis中多了三个键:
dmoz:requests 存放的是待爬取的requests对象
dmoz:item 爬取到的信息
dmoz:dupefilter 爬取的requests的指纹
CSDN
?
|