爬虫基础知识(玖)
一、Redis事务及乐观锁
1、Redis支持简单地事务
2、Redis与MySQL事务的对比:
MySQL |
Redis |
|
开启 |
start transaction |
multi |
语句 |
普通SQL |
普通命令 |
失败 |
rollback回滚 |
discard取消 |
成功 |
commit |
exec |
Redis的事务,在用multi开启之后,之后输入的所有命令,其实都是将其添加到一个执行队列中,当使用exec这个命令时,这个队列中的命令就会按顺序执行,使用discard这个命令式,这个队列就会被清空。
rollback与discard作用:
discard和rollback都可以做到回滚。但是discard其实就是将开启事务后的队列里面的命令清空。rollback是真正的回滚,就是回到开启事务之前的状态。
3、在multi后面的语句中,语句出错可能有2种情况:
(1)语法本身就有问题,此时,在输入命令时,就会报错。---直接会回滚。
(2)语法本身没错,但使用对象有问题。比如zadd操作list对象,这个命令也会被加入队列。exec之后,出错的那个命令之前的命令是会被执行的。
相当于只要事务的所有命令中出现任何语法错误,在exec时都会回滚,所有命令都不会执行。
4、乐观锁:
Redis的事务中,启用的是乐观锁,只负责监测key没有被改动。
具体的命令-----watch命令 例:watch ticket
二、消息订阅
Redis发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息。
Redis客户端可以订阅任意数量的频道。
使用办法:
订阅端:subscribe 频道名称
发布端:publish 频道名称 发布内容
消息的意义:建立客户端之间的通信
三、Redis持久化配置
Redis启动之后,就从硬盘上将所有数据读出来,加载到内存中。
持久化:将内存中的数据保存到硬盘上。
序列化:将对象保存到硬盘上。
Redis是一个内存数据库,它最大的特点就是可以将内存上的数据持久化到硬盘。这是为了保证数据在系统重启或者电脑电源关闭时,数据不会丢失。
当Redis启动的时候,会将硬盘的数据全部加载到内存,在内存上运行。
Redis持久化是通过两种方式来完成的:
·RDB快照
·AOF日志
(一)RDB快照
1、快照的配置选项:
·save 900 1 900秒内,有1条写入,则产生快照
·save 300 1000 300秒内有1000次写入,则产生快照
·save 60 10000 60秒内有10000写入,则产生快照
这三个选项都屏蔽,则RDB禁用。
2、和持久化相关的Redis配置:
·stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
·rdbcompression yes // 导出的rdb文件是否压缩
·Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
·dbfilename dump.rdb //导出来的rdb文件名
·dir ./ //rdb的放置路径
3、RDB快照的过程:
当触发三个条件其中的一个时,Redis就会进行RDB快照的备份,从照相到将内存镜像保存到dump.rdb文件的过程就是快照的过程。
4、RDB弊端:
RDB快照是需要消耗时间的,若在这个过程中触发了快照的条件,但是此时RDB正在进行中,此时的触发就无法正常使用RDB。而正式因为其存在隐患,所以产生了AOF日志。
(二)AOF日志
1、AOF其实就是一种日志记录方式来保存数据。
2、Redis的数据结构都是通过命令来的,也就意味着保存了命令就相当于保存了数据。因为只需将保存的命令执行一遍,就可以将Redis恢复到最后执行命令的状态。因此,AOF日志文件中存储的就是输入的命令,并且是以追加的方式保存的。
3、AOF的配置:
- appendonly no # 是否打开 aof日志功能
- appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
- appendfsync everysec # 折衷方案,每秒写1次
- appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
- no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof(原因是为了保证RBD和AOF数据的同一性)
- auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写(重写就是将数据逆化成命令,重新写入AOF的过程,目的是为了不让AOF无限增长)
- auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
(三)两种持久化机制的比较
RDB持久化 | AOF持久化 |
全量备份,一次保存整个数据库 | 增量备份,一次保存一个修改数据库的命令 |
保存间隔较长 | 保存间隔默认为1秒 |
数据还原速度快 | 数据还原速度一般 |
更适合数据备份,默认开启 | 更适合用来保存数据,默认关闭 |
启动优先级:低 | 启动优先级:高 |
体积:小 | 体积:大 |
恢复速度:快 | 恢复速度:慢 |
数据安全性:丢数据 | 数据安全性:根据策略决定 |
(四)Redis持久化相关的问题
1、在dump.rdb过程中,AOF如果停止同步,会不会丢失数据?
答:不会,所有的操作都会缓存在内存的队列里,dump完成后统一操作。
2、AOF重写是指什么?
答:AOF重写是指把内存中的数据,逆化成命令写入到AOF日志里,以解决AOF日志过大的问题。
3、若rdb文件和aof文件都存在,优先用谁来恢复数据?
答:这种情况下,当Redis重启时会优先载入aof文件来恢复原始的数据,因为通常情况下aof文件保存的数据要比rdb文件完整。
4、两种是否可以同时使用?
答:可以,且推荐这么做。
5、恢复时RDB和AOF哪个恢复的快?
答:RDB快,因为其是数据的内存映射,直接载入到内存,而AOF是命令,需要逐条执行。