Redis的持久化方法持久化方法有RDB文件和AOF文件两种。下面主要介绍两种持久化方法的原理缺点以及我在做交易系统异步化改造项目时用到redis的场景。
1 RDB文件
RDB文件是一个经过压缩的二进制文件,通过这个文件可以还原生成RDB文件时的数据库状态。RDB文件是直接保存在硬盘中的,所以即使Redis宕机也可以通过RDB文件恢复。生成RDB文件的Redis命令有SAVE和BGSAVE两个。
1.1 SAVE命令
Redis是单进程工作的,SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成之前,服务器不能接受任何处理命令。
1.2 BGSAVE命令
不同于SAVE命令,BGSAVE通过子进程创建RDB文件。当接收到BGSAVE命令后,Redis主进程会fork一个子进程负责创建RDB文件,Redis此时还可以继续处理客户端命令。BGSAVE执行期间如果客户端再次发送BGSAVE时会被拒绝,防止争用rdbSave。同样客户端发送SAVE也会被拒绝。
1.3 RDB文件载入
当RDB文件载入时,Redis会被阻塞,直到文件载入完成。
2 AOF文件
AOF文件文件是Redis提供的另一种持久化方案,他记录Redis服务器的执行命令还记录数据库的状态(和MySQL的Binlog有点类似)。AOF命令中记录的是纯文本格式的命令。AOF持久化的过程分为命令追加、文件写入和文件同步三个过程。
2.1 命令追加
当AOF持久化功能打开时,服务器在执行完一条命令后会以协议格式将执行完的命令追加到aof_buf缓冲区的末尾。
2.2 文件写入与同步
Redis服务进程是个事件循环,服务器每次在执行完一次事件之前都会调用flushAppendOnlyFile决定是否将aof缓冲区中的内容保存到AOF文件中。Redis服务器根据配置appendfsync决定同步策略,Redis为appendfsync提供了三种配置,分别为always、everysec、no。
当配置为always时,服务器每次事件循环都会将缓冲区中的所有内容都写到文件中,速度最慢但是最安全。
当配置为everysec时,服务器每隔1秒回将缓存中数据写到文件中,速度够快,最多丢失1秒的数据。
当配置为no时,由操作系统决定什么时间将缓存中内容写入到AOF文件中。
2.3 数据还原
Redis服务器利用AOF还原的原理是创建一个不带网络连接的伪客户端执行AOF中保存的命令即可。
2.4 缺点
AOF文件持久化得缺点是AOF文件往往会过大,虽然Redis提供了文件重写机制,但是在操作较多的时候AOF文件仍会很大。
3 交易系统场景Redis使用
我们交易系统Redis只当缓存用,并且不开启持久化功能,redis中的数据通过消息队列(kafka)同步到MySQL中,通过MySQL保证数据完整性、一致性。交易是个高频写入、峰值写入会特别大的系统,由上面分析的Redis两种持久化方案都会导致系统性能剧烈下降。