5

redis(12)持久化操作-RDB

 1 year ago
source link: https://www.cnblogs.com/jiakecong/p/17164786.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Redis 提供了 2 个不同形式的持久化方式:

  • RDB(Redis DataBase)

  • AOF(Append Of File)

指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的 Snapshot 快照,它恢复时是将快照文件直接读到内存里。

备份是如何执行的

Redis 会单独创建(fork)一个子进程来进行持久化,首先会将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失

  • Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

  • 在 Linux 程序中,fork () 会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,Linux 中引入了 “写时复制技术”

  • 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

RDB 持久化流程

1868812-20230228154841561-1134288289.png

 

dump.rdb 文件

rdb的默认配置文件名称为dump.rdb

rdb文件的保存路径,默认为 Redis 启动时命令行所在的目录下 “dir ./”,也可以自己修改

如何触发 RDB 快照-根据配置的策略

默认的配置策略如下图:

1868812-20230228160945377-1028835325.png

举例:save 60 10000,意思是在60s内生成了10000个key,那么redis就会以rbd的方式持久化数据,会先将数据保存在临时文件中,然后用临时文件替换掉当前的dump.rdb

命令 save VS bgsave

上面的例子使用的是save保存方式,redis中更推荐bgsave保存方式

  • save :save 时只管保存,其它不管,全部阻塞。手动保存,不建议。

  • bgsave:Redis 会在后台异步进行快照操作, 快照同时还可以响应客户端请求。

  • 可以通过 lastsave 命令获取最后一次成功执行快照的时间。

rdb持久化的优势

  • 适合大规模的数据恢复

  • 对数据完整性和一致性要求不高更适合使用

  • 节省磁盘空间

  • 恢复速度快

1868812-20230228162037754-467330531.png

 

rdb持久化的劣势

  • Fork 的时候,内存中的数据被克隆了一份,大致 2 倍的膨胀性需要考虑。

  • 虽然 Redis 在 fork 时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。

  • 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话,就会丢失最后一次快照后的所有修改。

1868812-20230228162233261-1327013182.png

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK