Redis 是一款内存型数据库,它的数据存储在内存中,因此在服务器断电或宕机的情况下,Redis 数据库会丢失所有数据。为了保证数据的持久性,Redis 提供了两种持久化技术:RDB 和 AOF。
RDB 持久化
RDB 是 Redis 默认的持久化技术,它通过定时将内存中的数据快照保存到磁盘上来保证数据的持久性。快照文件存储的是 Redis 数据库在某个时间点的状态。RDB 快照的生成有两种方式:自动触发和手动触发。
自动触发
RDB 默认会在满足以下条件时自动生成快照文件:
- 经过一定时间间隔(默认为 900 秒)。
- 经过一定的写操作数(默认为 10000 次)。
以上两个条件任意一个满足,则会触发 RDB 快照的生成。RDB 快照生成时,Redis 会通过单独的子进程将快照文件写入磁盘。
手动触发
除了自动触发,我们还可以手动触发 RDB 快照的生成。通过执行 SAVE 或 BGSAVE 命令可以触发 RDB 的持久化操作。
- 执行 SAVE 命令时,Redis 会在阻塞当前客户端的情况下,将内存数据存储到磁盘上。
- 执行 BGSAVE 命令时,Redis 不会阻塞当前客户端,而是通过创建子进程的方式将内存数据存储到磁盘上。
我们可以通过配置文件(redis.conf)来修改自动触发 RDB 快照的条件,也可以通过命令行参数来指定 RDB 文件的存储路径和生成 RDB 快照的时间间隔等参数。
RDB 回追
当 Redis 服务器重新启动时,可以通过读取 RDB 文件来快速载入之前的数据。Redis 会通过快照文件中的数据进行恢复,但是对于最后一次快照文件之后发生的数据,RDB 无法保证完全恢复。这样就会存在数据丢失的情况。因此,Redis 提供了 RDB 回追技术,可以通过 AOF 日志来回追 RDB 快照文件之后的修改操作,以保证数据的完整性。
AOF 持久化
AOF 持久化技术比 RDB 更安全。它会记录下 Redis 服务器执行过的所有写操作命令,例如 SET,DEL 等。每个操作命令都会被追加到 AOF 文件的末尾,以此来记录该命令的执行情况。当 Redis 服务器重新启动时,可以通过按照记录的命令从头到尾执行所有操作来还原出 Redis 数据库之前的状态。
AOF 重写
通过将多条操作命令合并为一条操作命令,可以减少 AOF 文件的大小。当 AOF 文件过大时,我们可以通过 AOF 重写技术来减小 AOF 文件的大小。AOF 重写会基于内存中的数据逐条执行所有操作命令,生成一份新的 AOF 文件,新的 AOF 文件大小只会包含必要的操作命令。
AOF 重写技术可以通过 BGREWRITEAOF 命令来手动触发,也可以通过配置文件(redis.conf)中的 auto-aof-rewrite-percentage 或 auto-aof-rewrite-min-size 参数来自动触发。
结论
综上所述,Redis 的持久化技术有 RDB 和 AOF 两种。如果要求高性能但数据可丢失可以选择 RDB 持久化技术,如果要求高可靠性可以选择 AOF 持久化技术。当然,结合使用 RDB 和 AOF 可以更好地保证数据的安全。例如,可以通过 RDB 回追技术来保证 RDB 文件之后的数据完整性,在 AOF 文件损坏的情况下可以通过 RDB 文件进行数据恢复。
示例代码:
- ---- --- ------ --------- ---- - -- --- -- --------- ------------
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66fa5b7144713626014bb5d3