Redis持久化之RDB

    xiaoxiao2025-07-08  14

    redis有两种持久化方式,RDB和AOF。RDB是Redis默认的持久化方式。

    什么是RDB?

    RDB持久化是指Redis在指定时间间隔内执行指定次数的写操作时,会将存储在内存上的数据通过快照的方式写入到二进制文件中,默认文件名为dump.rdb,当然,这个文件是可以在配置文件中进行自定义配置的。

    RDB的实现原理

    RedisRDB持久化的两种策略:save和bgsave(background save)。

    save是在主线程中进行保存数据快照的操作,手动操作,我们知道,Redis是单线程的,也就是说所有的客户端请求都是由它的主线程来进行处理的。save操作会阻塞所有客户端请求,因此,不推荐使用。

    127.0.0.1:6379> save OK

    bgsave是自动触发,当内存增长到指定值或者百分比时,会触发bgsave。Redis主线程调用fork函数,复制了一个当前线程的副本(即子线程),由父线程继续处理所有客户端请求,子线程将内存上的数据全部写到临时文件中,当子线程处理完所有数据后,临时文件将替换掉原来的快照文件(.rdb文件)。如果redis没有开启AOF持久化,在redis进行shutdown关闭时,会自动执行bgsave(使用kill关闭redis,则不会执行bgsave)。

    这样就完成了RDB持久化操作,当我们重启Redis时,硬盘上的.rdb文件载入到内存中。RDB文件中保存是命令执行后结果数据

    每次持久化都是数据的完整替换,而不是增量同步数据。这也就意味着,如果数据量大,并且写操作较多的话,将会引起大量的磁盘io操作,会严重影响性能,那么这个时候建议采取AOF方式。

    RDB相关的配置(【Redis的配置文件】中第264行)

    dir,指定RDB文件的存储路径;dbfilename,指定RDB文件的文件名。可以在src使用od -c dump.rdb命令来查看RDB文件内容。

    127.0.0.1:6379> config get dir 1) "dir" 2) "/opt/redis-5.0.4/src" 127.0.0.1:6379> config get dbfilename 1) "dbfilename" 2) "dump.rdb"

    rdbcompression,RDB文件是否使用压缩。

    127.0.0.1:6379> config get rdbcompression 1) "rdbcompression" 2) "yes"

    save,自动持久化数据的执行条件(指定时间间隔内执行指定次数的写操作),可以设置一个或者多个

    127.0.0.1:6379> config get save 1) "save" 2) "900 1 300 10 60 10000"

    900秒内,至少有1个key发生变化;300秒内,至少有10个key发生变化;60秒以内,至少一万个key发生变化。满足以上3个条件下任意一个条件,则会进行数据快照。

    RDB的优缺点

    优点:

    1、只有一个压缩后的二进制文件,能够极其方便地进行数据备份、(灾难性)数据恢复和数据转移;

    2、启动时加载RDB文件比AOF文件速度快,因为AOF文件中存放的是操作命令;

    3、性能最大化。主线程继续处理所有客户端请求,子线程进行数据备份。

    缺点:

    1、一旦Redis异常退出,就会丢失最后一次快照以后更改的数据,这样就会造成数据不完整性或者不一致;

    2、不能做到实时持久化,每次都会创建子线程,进行备份数据时,会生成临时文件,占用内存等资源;

    3、rdb二进制文件可能出现新老版本不兼容问题。  

     

     

    如果有写的不对的地方,请大家多多批评指正,非常感谢!

    最新回复(0)