为什么要持久化?
Redis是一种支持内存存储的键值对数据库,它可以将数据存储在内存中以提供高性能的读写操作。然而,由于内存的易失性,一旦Redis进程关闭或服务器断电,内存中的数据将会丢失。为了解决这个问题,Redis提供了持久化机制,将数据写入磁盘以便在重启后进行恢复。
Redis支持两种主要的持久化方式:
1. RDB(Redis数据库文件)持久化
RDB持久化是通过将Redis的数据快照写入磁盘来实现的。当满足一定条件时(如在指定的时间间隔内有指定数量的写操作),Redis会自动触发RDB持久化操作。该操作会生成一个二进制文件,包含了当前内存中的所有数据。RDB持久化是非常紧凑和高效的,适合用于备份、灾难恢复和数据迁移。
执行时机
RDB持久化在四种情况下会执行:
执行save命令
执行bgsave命令
Redis停机时
触发RDB条件时
1)save命令
执行下面的命令,可以立即执行一次RDB:(save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。)
2)bgsave命令
下面的命令可以异步执行RDB(执行的时候主进程不受影响,可以继续处理用户的请求)
3)停机时
Redis停机时会执行一次save命令,实现RDB持久化。
4)触发RDB条件
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
# x秒内,如果至少有y个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save x y
2. AOF(Append Only File)持久化
AOF持久化是通过将Redis的所有写操作追加到一个文件中来实现的。当Redis重启时,会重新执行这个文件中的写操作来恢复数据。AOF持久化可以确保数据的完整性和持久性,但相对于RDB持久化,它的文件通常会更大,恢复时间也更长。
AOF配置
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
AOF持久化有三种不同的同步策略可供选择:
我们可以在Redis的配置文件中设置AOF持久化的同步策略和其他相关配置。
- always:每个写操作都立即同步到磁盘,保证最高的数据安全性,但性能较低。
- everysec:每秒同步一次,平衡了数据安全性和性能。
- no:完全依赖操作系统进行同步,性能最高,但数据安全性较低。
AOF文件重写
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
总结
两种持久化方式的不同:
数据格式:
- RDB持久化:RDB持久化通过生成一个二进制的数据快照文件来保存Redis的数据。该文件是以二进制格式存储的,相对紧凑,适合用于备份、灾难恢复和数据迁移。
- AOF持久化:AOF持久化通过将Redis的写操作以日志的形式追加到一个文件中。该文件以文本格式存储,包含了Redis的命令和参数,以易读易理解的方式记录了数据的变化。
持久化过程:
- RDB持久化:RDB持久化是通过在指定的时间间隔内或写操作达到指定数量阈值时,生成一个快照文件,将内存中的数据写入磁盘。RDB持久化是一个全量持久化过程,即将当前时刻的所有数据保存到文件中。
- AOF持久化:AOF持久化是通过将每个写操作追加到AOF文件的末尾来实现。当Redis重启时,它会重新执行AOF文件中的写操作来恢复数据。AOF持久化是一个增量持久化过程,即将写操作追加到文件中,记录数据的变化。
文件大小和恢复时间:
- RDB持久化:由于RDB文件是二进制的数据快照,相对较小,恢复速度较快。但它只包含了某个时间点的数据,如果Redis关闭时发生故障,可能会丢失最后一次快照之后的数据。
- AOF持久化:AOF文件以文本格式存储Redis的写操作,相对较大,恢复速度较慢。但它包含了所有写操作的日志,可以保证更高的数据完整性,即使Redis关闭时发生故障,也可以通过重放AOF文件来恢复所有数据。
同步策略:
- RDB持久化:RDB持久化并不会实时同步数据到磁盘,而是在指定的时间间隔内或写操作达到指定数量阈值时进行。因此,存在一定的数据丢失的风险。
- AOF持久化:AOF持久化可以选择不同的同步策略,如always、everysec和no。always会在每个写操作后立即同步到磁盘,保证最高的数据安全性;everysec会每秒同步一次,平衡了数据安全性和性能;no则完全依赖操作系统进行同步,性能最高但数据安全性较低。
我们还可以同时启用RDB持久化和AOF持久化,以提供更高的数据安全性和恢复能力。在Redis重启时,它会首先加载AOF文件,然后再使用RDB文件进行恢复。