python爬虫之Scrapy介绍七——Redis内存数据库使用介绍

编程入门 行业动态 更新时间:2024-10-09 05:24:49

python<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫之Scrapy介绍七——Redis内存数据库使用介绍"/>

python爬虫之Scrapy介绍七——Redis内存数据库使用介绍

Redis内存数据库使用介绍

  • 1 数据库的发展历史
  • 2 Redis介绍
    • 2.1 什么是NoSQL
    • 2.2 什么是redis
    • 2.3 redis的安装和启用
    • 2.4 redis的配置文件
  • 3 Redis使用
    • 3.1 redis-string 字符串
    • 3.2 redis-list(单值多value) 列表
    • 3.3 redis-Hash 键值对集合
    • 3.4 redis-set(不重复的) 集合
    • 3.5 redis-Zset 有序集合
  • 4 Redis和python的交互
    • 4.1 string redis
    • 4.2 list redis
    • 4.3 set redis
    • 4.4 hash redis

1 数据库的发展历史

随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。

(1)单数据库实例:在互联网+大数据时代来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足系统的需求
(2)缓存(memcache)+单数据库实例:随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求。
(3)缓存+主从数据库+读写分离:缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大,使得读写分离,并产生的主从数据库,主数据库写入数据,从数据读取数据。
(4)缓存+主从数据库集群+读写分离+分库分表:数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈,出现分库分表。
(5)nosql+主从数据库集群+读写分离+分库分表:互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据

2 Redis介绍

2.1 什么是NoSQL

数据库大致可分为关系型数据库和非关系型数据库:
(1)关系型数据库是由多张能互相联接的二维行列表格组成的数据库。当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。
(2)非关系型数据库 :NoSQL,not only sql,主要有:Redis / MongoDB / Hbase Hadoop
(3) NoSQL和SQL数据库的比较
• 适用场景不同:SQL数据库适合用于关系特别复杂的数据查询场景,nosql反之
• 事务:SQL对事务的支持非常完善,而nosql基本不支持事务
• 两者在不断的取长补短

更详细关系型数据库和非关系型数据库的对比可以参见此文章:
关系型数据库和非关系型数据库的特性 以及各自的优缺点

2.2 什么是redis

(1)基本定义:是一个高性能的,开源的,C语言开发的,键值对存储数据的nosql数据库。
(2)特性:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
  • Redis支持数据的备份
    (3) 用途:快速存取
    (4)应用场景:点赞/秒杀/直播平台的在线好友列表/商品排行榜/单点登录
    (5)常用网址:
    官网地址:/
    命令地址:/

2.3 redis的安装和启用

安装命令

sudo apt-get install redis-server

查看帮助命令

redis-server --help

编辑redis配置文件

(1)将目录下sudo vim /etc/redis/redis.conf的配置文件打开
(2)将daemonize no改为 daemonize yes保存退出

在终端启动,输入以下命令,启动客户端

redis-server

启动客户端成功

在另启一个终端,链接服务端,打开服务

redis-cli.exe

启动服务端成功

关闭服务

sudo service redis stop

2.4 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

更多配置文件介绍可以参见:redis.conf配置详细解析

3 Redis使用

Redis有五大常用数据类型,下面分别介绍它们的应用场景

3.1 redis-string 字符串

string是redis最基本的类型,一个key对应一个value

string可以包含任何数据,最大不能超过512M
1.set/get/del/append/strlen

set  ---- 设置值
get  ---- 获取值
mset  ---- 设置多个值
mget  ---- 获取多个值
append ---- 添加字段
del ---- 删除
strlen ---- 返回字符串长度


2.incr/decr/incrby/decrby

incr ---- 增加
decr ---- 减少
incrby  ----- 制定增加多少
decrby  ----- 制定减少多少


3.getrange/setrange

getrange ---- 获取指定区间范围内的值,类似between....and的关系
setrange ---- 代表从第几位开始替换,下脚本从零开始
从0 -1表示全部

3.2 redis-list(单值多value) 列表

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边)或者尾部(右边)
它的底层实际是个链表

1.lpush/rpush/lrange

lpush/rpush/lrange ---- 从左/从右/获取指定长度
lpush list01  1 2 3 4 5  倒序排列
rpush list02  1 2 3 4 5  正序排列
lrange  list01  0  -1  获取list01 中的所有值

2.lpop/rpop

lpop/rpop ---- 移除最左/最右
lpop list01 删除元素5
rpop list01 删除元素1

3.lindex,按照索引下标获得元素(从上到下)

lrange list01 0 -1
lindex list01 1

4.llen,求列表长度

llen list01

5.lrem key

删N个value
lrem list01 2 1   在list01中删除2个1

6.ltrim key

ltrim ---- 开始index结束index,截取指定范围的值后再赋值给key
ltrim list01 0 2    截取list01 从0到2的数据再赋值给list01

7.rpoplpush list1 list2 将list1中最后一个压入list2中第一位

lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2

使用8.linsert key before/afte

linsert list01b  before x php  在x之前加字段php

3.3 redis-Hash 键值对集合

hash是一个键值对集合
hash是一个string类型的field和value的映射表,hash特别适合存储对象

1.hset/hget/hmset/hmget/hgetall/hdel

设值/取值/设值多个值/取多个值/取全部值/删除值
hset user id 11
hget user id 
hmset customer id 11 name juran age 26
hmget customer id name age      只返回相应的值
hgetall   customer              返回全部
hdel user id   删除id

2.hlen长度

求哈希长度 
hlen customer

3.hexists key

hexists ---- 在key里面的某个值
存在返回1 ,不存在返回0

4.hkeys/hvals

hkeys students
hvals students

3.4 redis-set(不重复的) 集合

set是string类型的无序集合

1.sadd/smembers/sismember

sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3  去掉重复添加
smembers set01   得到set01
sismember set01 1  如果存在返回1  不存在返回0

2.scard

scard ---- 获取集合里面的元素个数
scard set01

3.srem key value

srem ---- 删除集合中元素
srem set01 3
SMEMBERS set01   3已经被删除掉

4.srandmember key

srandmembe ---- 随机出几个数
sadd set02  1 2 3 4 5 6 7 8
srandmember set02  2

5.spop key

spop ---- 随机出栈
spop set01

6.smove key1 key2

sadd set03 x y z 
smove set01 set03 2  将set01中的2 移动到set03中

7.数学集合类

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 中的值  去掉重复

3.5 redis-Zset 有序集合

Zset(有序集合)

1.zadd/zrange

zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1 
带分数返回   withscores

2.zrangebyscore key start end

zrangebyscore key start end----根据开始结束来取值
zrangebyscore zset01 60 70zrangebyscore zset01 60 (90   表示不包含90zrangebyscore zset01  60 90  limit  1 2 从第一条开始截取2条

3.zrem key

zrem key value---- 某score下对应的value值,作用是删除元素
zrem zset01 v1

4.zcard/zcount key score 区间/zrank key values

zcard   求zset01 总条数
zcount  zset01 60 90  求60-90个数
zrank   zset01  v2   返回1  返回对应下角标,从0开始

4 Redis和python的交互

首先需要先启动客户端

redis-server

4.1 string redis

# 连接Redis
# 连接地址
# 端口号import redisclass StringRedis(object):def __init__(self):self.r = redis.StrictRedis(host='127.0.0.1', port=6379, decode_responses=True)def string_set(self, k, v):"""设置值"""res = self.r.set(k, v)print(res)def string_get(self, k):"""取值"""res = self.r.get(k)return resif __name__ == '__main__':s = StringRedis()s.string_set('name', 'juran')print(s.string_get('name'))print(type(s.string_get('name')))

4.2 list redis

import redisclass ListRedis(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130',port=6379)def list_set(self, k, v):"""设置值"""res = self.r.lpush(k, v)print(res)def list_get(self, k):"""取值"""res = self.r.lrange(k,0,-1)return resdef list_push(self,name,value):"""插值"""res = self.r.lpush(name,value)return  resdef list_pop(self,k):"""弹出值"""res = self.r.lpop(k)return resif __name__ == '__main__':l = ListRedis()l.list_set('list01', '1')print(l.list_get('list01'))print(l.list_push('list02','2'))

4.3 set redis

import redisclass SetRedis(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)print(res)def test_del(self):"""删除数据"""res = self.r.srem('set01',1)print(res)def test_pop(self):"""随机删除数据"""res = self.r.spop('set02')print(res)if __name__ == '__main__':s = SetRedis()s.test_sadd()s.test_del()s.test_pop()

4.4 hash redis

import redisclass HashRedis(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130', port=6379)def hash_set(self,dic):"""批量设值"""dic = {'id': 1,'name': 'huawei'}res = self.r.hmset('mobile', dic)return resdef hash_getall(self):"""批量取值"""res = self.r.hgetall('mobile')return resdef test_hexists(self):"""判断是否存在,存在返回1.不存在返回0"""res = self.r.hexists('mobile', 'id')print(res)if __name__ == '__main__':h = HashRedis()dic = { 'id': 1,'name': 'huawei'}h.hash_set(dic)print(h.hash_getall())

更多推荐

python爬虫之Scrapy介绍七——Redis内存数据库使用介绍

本文发布于:2024-03-09 18:52:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725799.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   内存   数据库   python   Redis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!