Redis的持久化

Redis持久化有两个方式,分别是AOF和RDB。

为什么需要提供两种方式呢?两种方式有啥区别?各自的优缺点是什么?什么场景下用什么方式?
带着这些问题,我们来看一下

1.RDB方式

Redis是一个内存数据库,为了防止数据丢失肯定是需要将数据持久化到磁盘上的,RDB就是Redis提供的一种数据持久化方式,RDB文件保存的是二进制数据。
Redis默认就采用了RDB方式,RDB是通过快照的方式持久化
关于redis的配置都在redis.conf文件里面

1.1下面我们看看关于RDB的主要配置:
#运行rdb文件压缩  默认开启
rdbcompression yes
#rdb生成的快照文件名
dbfilename dump.rdb
# save <seconds> <changes> 控制rdb的触发时机  以下是默认配置
save 900 1  : 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 : 表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000 :表示1分钟内至少10000个键被更改则进行快照。

Redis的服务器周期性操作函数ServerCron默认每个100秒就会执行一次

1.2客户端触发RDB

有两个Redis命令可以用于生成RDB文件,一个SAVE,另一个是BGSAVE.
SAVE: 会阻塞Redis服务器进程,知道RDB文件创建完毕,在阻塞期间服务器不能处理任何命令(不推荐使用)。
BGSAVE: BGSAVE命令会派生(Redis调用fork函数,复制一份当前进程副本)出一个子进程,由子进程负责创建RDB文件(为了防止写入出现问题而造成较大影响,先写入临时文件,写入完毕后用临时文件替换旧RDB文件),服务器进程可继续处理命令请求。

注意事项:

  • Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。
1.3RDB方式总结

① rdb是redis默认的持久化策略,是通过快照的方式持久化;
② rdb方式存在丢数据的可能(还没来得及触发快照Redis服务就挂了,上次RDB持久化后到挂机期间的数据就丢失了);
③ 如果不能容忍丢数据,那么就需要结合AOF持久化方式了,但现在公司用Redis基本都是做缓存的,也就是说数据库里肯定有完整数据(程序查询先走缓存,没有就查数据库然后放到缓存中),也就没必要用AOF了,毕竟AOF对性能有影响,因为会频繁写磁盘。

2. AOF方式

AOF(Append Only File)持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。是以内容追加的方式写入到文件。AOF需要手动修改配置开启。

2.1 AOF的配置
# 默认就是no,要开启aof需要修改为yes
appendonly no
#aof文件名
appendfilename "appendonly.aof"
#设置aof文件重写的百分比
auto-aof-rewrite-percentage 100
#触发aof重写的文件最小值
auto-aof-rewrite-min-size 64mb
2.2 AOF的触发

Redis服务器在执行完一个写命令后,会以协议格式将执行的写命令追加到aof_buf缓冲区的末尾,就是说写命令是先写入的缓冲区中
Redis的服务器进程就是一个事件循环,处理文件事件时就可能会执行写请求,就会将一些命令追加到aof_buf缓存中。将命令写到缓存中后,由appednfsync来配置是否刷新到磁盘。
这个配置有三个参数:

  • always:每次事件循环就会将aof_buf缓冲区的数据同步一次磁盘(效率最低,数据安全性最高);
  • everysec:每隔一秒钟将aof_buf缓冲区的数据同步一次磁盘;
  • no:什么时候将缓存区数据同步到磁盘由操作系统觉得;
2.3AOF的文件重写

由于aof文件是以追加的方式写入文件,会随着写命令越来越多,文件变得越来越大,所以就需要文件重写。
AOF的文件重写并不需要对现有AOF文件进行读取和修改,这个功能是通过读取服务器当前的数据库状态来进行的。从数据库中取出键值,用命令去记录键值。

AOF重写命令BGREWRITEAOF:
执行原理:在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,用于在子进程创建新AOF文件期间,记录期间执行的写命令;当子进程完成创建新AOF文件的工作后,服务器会将重写缓冲区的所有命令追加到新AOF文件末尾,最后替换旧的AOF文件。

3.其它问题

1.当RDB和AOF都开启的情况下,Redis启动默认加载的是AOF文件;
2.为什么Redis在进行异步RDB和AOF都是fork出子进程,而不用线程?因为使用子进程可以在避免使用锁的情况下保证数据的安全性。
3.根据具体情况选择持久化方式,可以两个方式配合使用。
4.Redis基于Reactor模式开发了自己的网络事件处理器;文件事件处理器使用I/O多路复用来同时监听多个套接字;文件事件处理器即实现了高性能的网络通信模型,又可以很好与Redis服务器中其它同样以单线程方式运行的模块进行对接,保持了Redis内部单线程设计的简单些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值