Redis之持久化
(一)问题产生
Redis是一款非常好用的键值对数据库,其高性能和灵活性而闻名,它是基于内存的来实现的,所以它有很多优势也伴随着一些缺陷。
如,容量限制:内存并不是无限的,他很小且宝贵;易失:内存一断电就没了,Redis数据也会没有,还有一些安全性问题,而今天我们需要解决的是关于数据易失问题,提出数据持久化来解决。
(二)数据持久化
数据持久化简单来说就是将数据放到磁盘中,就算断电也不会消失了,为此提供二种方式。RDB快照和AOF日志。
无论是RDB还是AOF都是利用数据备份与恢复机制,只是他们的实现方式不同罢了。
RDB快照备份(默认)
SAVE
命令用于创建当前数据库的持久化快照,这个快照会保存到配置文件中指定的文件路径下,默认通常是 dump.rdb
文件。
redis 127.0.0.1:6379> SAVE
OK
值得注意的是, SAVE
命令本身不接受任何参数,默认情况下,这个文件通常被命名为 dump.rdb
,并且存储在 Redis 服务器的安装目录或者配置文件中指定的其他目录。因此,如果有需要,你需要在配置文件中修改才可以。一般在redis.windows.conf
文件中。可以使用查找
# The filename where to dump the DB
dbfilename dump.rdb
# Note that you must specify a directory here, not a file name.
dir ./
来分别修改默认文件名称以及地址。
SAVE
命令会阻塞 Redis 服务器,直到 RDB 文件完全写入磁盘。这意味着在持久化过程中,Redis 无法处理任何其他命令,这可能会对性能造成影响。
除了 SAVE
,Redis 还提供了 BGSAVE
命令,这是一个异步操作,它会在后台创建 RDB 文件的快照,不会阻塞主进程。
当然,Redis也提供了自动备份的功能: save 秒钟 写操作次数
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
恢复 RDB 文件也很简单,首先,确保备份的 RDB 文件(通常名为 dump.rdb
)是最新的备份,并且没有损坏,停止 Redis 服务,以避免在恢复过程中数据被修改,将备份的 RDB 文件移动到 Redis 的数据目录中。可以使用 CONFIG GET dir
命令来查看 Redis 的数据目录,重新启动 Redis 服务。Redis 启动时会自动加载数据目录中的 RDB 文件,并恢复数据。
AOF日志备份
AOF持久化是一种将所有写操作记录到一个文件中的持久化方式(以日志的形式来记录每个写操作),与RDB不同的是他需要启动,同样也在配置文件中,将appendonly
改成yes
即可。
# Please check http://redis.io/topics/persistence for more information.
appendonly no
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
Redis 允许你设置不同的fsync
策略。fsync
是一个操作系统调用,用于将文件缓冲区中的数据强制写入磁盘。
everysec
:默认每秒进行一次 fsync
操作,这是一个折衷的选项,既保证了数据安全性,又不会太影响性能。
always
:每次写操作后都进行 fsync,数据安全性最高,但可能会影响性能。
no
:从不自动 fsync
,依赖操作系统的缓冲区刷新机制,性能最好,但数据安全性最低。
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
随着时间的推移,AOF 文件可能会变得非常大,因为它记录了所有的写操作。Redis 会定期地对 AOF 文件进行重写,即创建一个新的 AOF 文件,只包含恢复当前数据集所需的最小命令集合。
Redis 可以自动触发 AOF 重写,当 AOF 文件的大小达到一定阈值时(例如,比上一次重写后的文件大指定百分比)。可以通过配置文件或运行时配置来设置 AOF 重写的相关参数,例如触发重写的文件大小阈值:
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当 AOF 文件大小比上一次重写后至少增加了 100%,并且文件大小至少为 64 MB 时,Redis 将自动触发 AOF 重写。
AOF 重写是在后台异步执行的,它使用子进程来完成重写任务,因此不会阻塞主进程的读写操作。
除了自动触发,你也可以使用 BGREWRITEAOF
命令手动触发 AOF 重写
redis 127.0.0.1:6379>redis-cli BGREWRITEAOF
Redis 在重写 AOF 文件时,会创建一个临时的重写缓冲区,然后将缓冲区中的数据写入一个新的 AOF 文件。一旦新的 AOF 文件写入完成,Redis 会用它替换旧的 AOF 文件。可以使用 redis-cli info persistence
命令来监控 AOF 重写的进度和状态。