Redis深入学习之详解持久化原理

1. Redis持久化解决什么问题?

Redis是一款基于内存的Key-Value存储系统,由于内存的易失性,Redis重启后所有的数据都会被清空。为了解决这个问题,Redis提供了持久化的机制,将内存中的数据保存到硬盘中,确保在Redis重启后依然能够恢复之前保存的数据。Redis提供了两种持久化方式:

1.1 RDB

Redis数据库快照是一种基于时间点的持久化方式。Redis会周期性的将内存中的快照数据写入磁盘,形成rdb文件,从而实现数据的持久化。Redis会fork一个子进程来完成快照文件的创建,所以快照期间不会影响主进程的读写操作。RDB持久化的优点是产生的文件比AOF持久化小,因此适合大规模数据的备份和恢复。RDB文件可以直接拷贝或压缩,可以方便地进行备份和迁移,但是也有缺点:如果Redis出现故障或崩溃,会有一定的数据丢失。

RDB持久化配置:

save 900 1 #表示900s内如果有至少1个key被更改,就调用一次快照

save 300 10 #表示300s内如果有至少10个key被更改,就调用一次快照

save 60 10000 #表示60s内如果有至少10000个key被更改,就调用一次快照

1.2 AOF

AOF是一种基于日志的持久化方式。Redis将每个写操作都记录到日志中,重启时再根据日志回放操作,重构出完整的数据集。AOF持久化的优点是可以实现更精确的持久化,数据库重启后可以保证不丢失任何一次写入。缺点是增量记录频繁导致文件过大。

AOF持久化配置:

appendonly yes #打开AOF持久化

appendfsync always #每次写入都调用fsync同步到磁盘,效率低

appendfsync everysec #每秒调用fsync同步到磁盘

appendfsync no #不做同步操作,交由操作系统决定何时刷新缓存

2. Redis持久化的实现原理

Redis持久化的实现原理如下:

2.1 RDB持久化实现原理

当Redis数据库进行RDB持久化时,Redis主进程会调用fork()函数创建一个子进程,然后由子进程负责将数据写入磁盘。

子进程先将整个数据集写入到一个临时文件中,然后将这个临时文件重命名为指定的文件名,代替原先的数据文件。因为在Linux系统中,文件重命名比文件写入操作要快得多,因此这种方式可以极大地提高持久化效率。

RDB持久化实现原理示意图:

+--------+ +--------+

| |-fork->| | 数据文件读取

|master | | child |- + 数据写入临时文件

| |<-管道-| | 临时文件持久化到硬盘

+--------+ +--------+

2.2 AOF持久化实现原理

当Redis数据库进行AOF持久化时,Redis会把每一次写操作都写入到一个缓冲区中,然后再异步地将缓冲区中的内容写入到AOF文件。如果缓冲区的内容太多,Redis会使用多个线程将内容刷入AOF文件,如下图所示:

AOF持久化实现原理示意图:

+-------+ +-------+ +-------+

| | -> 数据| | -> AOF | | -> 磁盘

| master|-> 缓冲| AOF |-> 缓冲|-> 多线|-> AOF

| |

|Buffer | | 处理

|文件

+-------+ +-------+ +-------+

3. Redis持久化的性能参数调优

3.1 RDB持久化性能参数调优

在使用RDB持久化时,需要注意以下性能参数的配置:

save:表示触发快照的条件,可以多个save配置,只要满足其中一个就会触发快照操作。

stop-writes-on-bgsave-error:当Redis进行RDB持久化时,如果出现错误,Redis会停止接受新的写操作,该参数可设置为no,让Redis继续接受写操作。

rdbcompression:表示是否采用压缩算法来保存RDB快照文件。

rdbchecksum:表示是否在生成RDB快照文件时进行数据校验。

rdb-save-incremental-fsync:表示是否让操作系统每写入一定量的数据就调用一次fsync()刷盘。

3.2 AOF持久化性能参数调优

在使用AOF持久化时,需要注意以下性能参数的配置:

appendonly:表示是否开启AOF持久化,默认值为no。

appendfsync:表示同步AOF文件的频率。

auto-aof-rewrite-min-size:AOF文件体积超过这个值时,Redis会自动启动AOF文件重写操作。

auto-aof-rewrite-percentage:表示执行自动AOF文件重写时,新AOF文件的大小相对于旧AOF文件的比例。

数据库标签