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文件的比例。