redis持久化 mysql_Redis持久化与数据库持久化

简介

本文简要介绍Redis持久化与数据库持久化的区别,主要参考Redis作者的blog(见下文参考文献);在数据库部分中,本文详细调研了MySQL的实现方式进行补充。

数据库写操作

原文中介绍数据库在进行写操作时到底做了哪些事,主要有下面五个过程。

客户端向服务端发送写操作(数据在客户端的内存中)

数据库服务端接收到写请求的数据(数据在服务端的内存中)

服务端调用write(2) 这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)

操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)

磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)

依据MySQL官网介绍,InnoDB的写文件过程正是上述过程,又称 Doublewrite Buffer;这样做的好处是:

在崩溃或断电后增加了恢复的安全性,并通过减少对fsync()操作的需求,提高了Unix大多数品种的性能。

Redis中RDB持久化

Redis支持将当前数据的快照存成一个数据文件的持久化机制。Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。

我们可以通过Redis的save指令来配置RDB快照生成的时机,比如你可以配置当10分钟以内有100次写入就生成快照,也可以配置当1小时内有1000次写入就生成快照,也可以多个规则一起实施。这些规则的定义就在Redis的配置文件中,你也可以通过Redis的CONFIG SET命令在Redis运行时设置规则,不需要重启Redis。

RDB的不足,就是一旦数据库出现问题,RDB文件中保存的数据并不是全新的,从上次RDB文件生成到Redis停机这段时间的数据全部丢掉了。

Redis中AOF持久化

AOF日志的全称是Append Only File,它是一个追加写入的日志文件。与一般数据库的binlog不同的是,AOF文件是可识别的纯文本,它的内容就是一个个的Redis标准命令。

AOF重写

随着Redis执行命令的增加,AOF文件会越来越大,故Redis又提供了一个功能:AOF rewrite。其功能就是重新生成一份AOF文件,新的AOF文件中一条记录的操作只会有一次,而不像一份老文件那样,可能记录了对同一个值的多次操作。其生成过程和RDB类似,也是fork一个进程,直接遍历数据,写入新的AOF临时文件。在写入新文件的过程中,所有的写操作日志还是会写到原来老的AOF文件中,同时还会记录在内存缓冲区中。当重完操作完成后,会将所有缓冲区中的日志一次性写入到临时文件中。然后调用原子性的rename命令用新的AOF文件取代老的AOF文件。

数据导入

Redis是一个内存数据库,无论是RDB还是AOF,都只是其保证数据恢复的措施;故Redis在利用RDB和AOF进行恢复的时候,都会读取RDB或AOF文件,重新加载到内存中。相对于MySQL等数据库的启动时间来说,会长很多,因为MySQL本来是不需要将数据加载到内存中的。

在利用RDB和利用AOF启动上,其启动时间有一些差别。RDB的启动时间会更短,原因有两个,一是RDB文件中每一条数据只有一条记录,不会像AOF日志那样可能有一条数据的多次操作记录。所以每条数据只需要写一次就行了。另一个原因是RDB文件的存储格式和Redis数据在内存中的编码格式是一致的,不需要再进行数据编码工作。在CPU消耗上要远小于AOF日志的加载。

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值