Redis的持久化机制

您所在的位置:网站首页 redis重启后只读 Redis的持久化机制

Redis的持久化机制

2023-07-11 05:02| 来源: 网络整理| 查看: 265

摘要

Redis的数据都是存储在内存中的,这样可以保证数据的快速访问和处理,但是也带来了一个问题,就是如果Redis进程退出或者服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了两种主要的持久化机制,分别是RDB持久化和AOF持久化。这两种持久化机制都可以将内存中的数据保存到磁盘中,以便在Redis重启后恢复数据,但是它们的原理和特点是不同的。本文将介绍Redis的这两种持久化机制,希望能帮助大家理解和使用Redis的持久化功能。

RDB持久化

RDB持久化是指通过数据集快照的方式,将Redis内存中的所有键值对在某个时间点写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复的目的。RDB持久化有两种触发方式:手动触发和自动触发。

手动触发

手动触发可以使用save或bgsave命令,其中save命令会阻塞Redis主进程直到快照生成完成,而bgsave命令会fork一个子进程来负责生成快照,主进程只会在fork时短暂阻塞。这里怎么理解呢?举一个形象的例子吧,你可以把Redis的内存数据想象成一本书,每一页都有一些文字。当你执行bgsave命令时,就相当于你要把这本书复印一份,作为快照文件。但是复印一本书是很耗时的,如果你一直在复印机旁边等着,就不能做其他事情了。所以,你决定让你的助手来帮你复印,这就相当于fork一个子进程。但是你的助手也需要一些时间来准备,比如拿纸张、调整复印机等,这个过程中,你还是要等着他,这就相当于主进程在fork时短暂阻塞。等到你的助手准备好了,开始复印第一页,你就可以离开了,去做其他事情,这就相当于主进程继续处理其他命令。而你的助手则会一直复印这本书,直到复印完毕,把复印件交给你,并且告诉你他完成了任务,这就相当于子进程生成快照文件,并在完成后自动退出。 下面是一个简单的示例:

# 使用save命令手动触发RDB持久化 127.0.0.1:6379> set name Alice OK 127.0.0.1:6379> save OK # 查看RDB文件 $ ls -l dump.rdb -rw-r--r-- 1 user staff 40 Oct 30 16:38 dump.rdb # 使用bgsave命令手动触发RDB持久化 127.0.0.1:6379> set name Bob OK 127.0.0.1:6379> bgsave Background saving started # 查看RDB文件 $ ls -l dump.rdb -rw-r--r-- 1 user staff 40 Oct 30 16:40 dump.rdb 自动触发

自动触发可以通过配置文件中的save参数来设置,在满足一定的时间和变更条件时,自动执行bgsave命令。下面是一个配置文件中的示例:

################################ SNAPSHOTTING ################################ # # Save the DB on disk: # # save # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed save 900 1 save 300 10 save 60 10000

其中save 900 1表示在900秒内如果至少有1个key发生变化,就触发bgsave命令,将数据保存到RDB文件中;save 300 10表示在300秒内如果至少有10个key发生变化,就触发bgsave命令;save 60 10000表示在60秒内如果至少有10000个key发生变化,就触发bgsave命令。另外,在主从复制、debug reload或shutdown命令时,也会自动触发RDB持久化。

RDB持久化的优缺点 RDB持久化的优点是:

快照文件体积小,压缩率高,适合做备份和迁移; 数据恢复速度快,比AOF快得多; 对Redis性能影响小,只有在fork子进程时会有短暂阻塞。

RDB持久化的缺点是:

数据安全性低,不能做到实时或秒级持久化,如果发生故障,可能会丢失最近一段时间的数据; 快照文件格式依赖于Redis版本,可能存在兼容性问题。(RDB文件使用了特定的二进制格式来保存数据,不同版本的Redis可能使用了不同的格式。如果使用老版本的Redis服务来加载新版本生成的RDB文件,可能会出现错误或数据丢失的情况。)

AOF持久化

AOF(Append Only File)持久化是指将Redis执行的每一个写命令追加到一个日志文件中,以文本形式记录,以便在重启时重新执行这些命令来恢复数据。AOF持久化默认是关闭的,需要在配置文件中将appendonly参数设置为yes来开启。AOF持久化有三种同步策略:always、everysec和no。always策略表示每个写命令都立即同步到磁盘,这样可以保证数据不丢失,但是性能损耗很大;everysec策略表示每秒同步一次到磁盘,这样可以平衡数据安全性和性能;no策略表示由操作系统决定何时同步到磁盘,这样性能最好,但是数据安全性无法保证。一般推荐使用everysec策略。

AOF持久化的原理

下面是一个简单的示例:

开启AOF持久化 127.0.0.1:6379> config set appendonly yes OK # 执行一些写命令 127.0.0.1:6379> set name Alice OK 127.0.0.1:6379> set age 18 OK # 查看AOF文件 $ cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $5 Alice *3 $3 set $3 age $2 18

可以看到,AOF文件中记录了每一个写命令的详细信息,包括参数个数、参数长度和参数值。这些信息都是以RESP(REdis Serialization Protocol)协议的格式来存储的。当Redis重启时,它会读取AOF文件中的所有命令,并按顺序重新执行一遍,从而恢复数据。

AOF重写机制

为了解决AOF持久化的缺点,Redis提供了一种AOF重写机制,即根据当前内存中的数据,生成一个新的AOF文件,替换掉旧的AOF文件,从而减少AOF文件的体积和恢复时间。AOF重写也有两种触发方式:手动触发和自动触发。手动触发可以使用bgrewriteaof命令,该命令会fork一个子进程来负责重写AOF文件,主进程只会在fork时短暂阻塞。自动触发可以通过配置文件中的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size参数来设置,在AOF文件增长到一定大小且比上次重写后的大小增长了一定百分比时,自动执行bgrewriteaof命令。

下面是一个简单的示例:

# 执行一些写命令 127.0.0.1:6379> set name Alice OK 127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> set name Bob OK # 查看AOF文件大小和内容 $ ls -l appendonly.aof -rw-r--r-- 1 user staff 75 Oct 30 17:00 append $ cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $5 Alice *3 $3 set $3 age $2 18 *3 $3 set $4 name $3 Bob # 手动触发AOF重写 127.0.0.1:6379> bgrewriteaof Background append only file rewriting started # 查看AOF文件大小和内容,可以看到文件变小了,而且只保留了最新的数据状态,不再记录每个命令的历史。 $ ls -l appendonly.aof -rw-r--r-- 1 user staff 50 Oct 30 17:02 appendonly.aof $ cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $3 Bob *3 $3 set $3 age $2 18 AOF持久化的优缺点 AOF持久化的优点是:

数据安全性高,可以做到实时或秒级持久化,如果发生故障,数据丢失的可能性很小; 日志文件是追加模式,不容易发生写错或损坏; 日志文件是可读的文本格式,方便人工处理。

AOF持久化的缺点是:

日志文件体积大,占用磁盘空间多,可能影响磁盘性能; 数据恢复速度慢,比RDB慢得多; 对Redis性能影响大,同步频率越高,影响越大。

RDB和AOF的比较和选择

RDB和AOF是Redis提供的两种持久化机制,它们各有优缺点,可以根据不同的场景和需求进行选择或组合使用。下面是一个简单的对比表格:

持久化方式 数据安全性 恢复速度 性能影响 文件体积 文件格式 RDB 低 快 小 小 二进制 AOF 高 慢 大 大 文本 一般来说,如果对数据安全性要求高,可以使用AOF持久化;如果对性能和恢复速度要求高,可以使用RDB持久化;如果既要数据安全性又要性能和恢复速度,可以同时使用RDB和AOF持久化,并且优先加载AOF文件来恢复数据。同时使用两种持久化机制时,需要注意以下几点:

如果只开启了RDB持久化,那么在Redis重启时会加载RDB文件来恢复数据; 如果只开启了AOF持久化,那么在Redis重启时会加载AOF文件来恢复数据; 如果同时开启了RDB和AOF持久化,那么在Redis重启时会优先加载AOF文件来恢复数据,因为AOF文件通常包含了RDB文件中的所有数据,并且更完整; 如果想要修改默认的加载策略,可以在配置文件中设置loadmodule参数来指定加载哪种持久化文件; 如果想要在运行时修改持久化配置,可以使用config set命令来动态调整。

总结

本文介绍了Redis的两种持久化机制:RDB持久化和AOF持久化,以及它们的原理、优缺点和选择方法。如果对你有帮助的话,别忘了点赞加关注。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3