当前位置: 首页 > 科技观察

Redis持久化的几种方式——深入分析RDB

时间:2023-03-11 21:05:21 科技观察

Redis在内存中读写,所以性能高,但是内存中的数据会随着服务器的重启而丢失。为了保证数据不丢失,我们需要将内存中的数据存储到磁盘中,这样Redis重启的时候就可以从磁盘中恢复出原来的数据,整个过程称为Redis持久化。Redis持久化也是Redis和Memcached的主要区别之一,因为Memcached没有持久化功能。1、持久化的几种方式Redis持久化有以下三种方式:快照方式(RDB,RedisDataBase)将某一时刻的内存数据以二进制形式写入磁盘;文件追加方法(AOF,AppendOnlyFile),记录所有的操作命令,并以文本的形式追加到文件中;混合持久化方式,Redis4.0之后新增的一种方式,混合持久化结合了RDB和AOF的优点,在写入的时候,先将当前数据以RDB的形式写入文件开头,然后将后续的操作命令存入AOF格式的文件,既可以保证Redis重启的速度,又可以降低数据丢失的风险。因为每种持久化方案都有特定的使用场景,所以我们先从RDB持久化说起。2.RDB简介RDB(RedisDataBase)是将某一时刻的内存快照(Snapshot)以二进制形式写入磁盘的过程。3、持久化触发RDB的持久化触发方式有两种:一种是手动触发,一种是自动触发。1)手动触发手动触发持久化有两种操作:save和bgsave。它们的主要区别在于是否阻塞Redis主线程的执行。①save命令在客户端执行save命令会触发Redis的持久化,但同时也会使Redis处于阻塞状态。在RDB持久化完成之前,它不会响应其他客户端发送的命令。因此,在生产环境中,一定要慎用。save命令的使用如下:从图中可以看出,save命令执行后,持久化文件dump.rdb的修改时间发生了变化,说明save成功触发了RDB持久化。save命令的执行流程如下图所示:②bgsave命令bgsave(backgroundsave)表示在后台保存。它和save命令最大的区别是bgsave会fork()一个子进程来进行持久化。fork()子进程时有一个短暂的阻塞,当子进程被创建时,Redis的主进程可以响应其他客户端的请求,相对于阻塞整个进程的save命令,显然bgsave命令比较适合我们使用。使用了bgsave命令,如下图:bgsave执行流程,如下图:2)自动触发说完RDB的手动触发方式,我们来看看如何自动触发RDB持久化?RDB自动持久化主要来自以下几种情况。①savemnsavemn表示m秒内n个key发生变化,则自动触发持久化。参数m和n可以在Redis配置文件中找到。例如save601表示如果60秒内至少有一个key发生变化,则触发RDB持久化。自动触发持久化的本质是Redis通过判断满足设置的触发条件会自动执行一条bgsave命令。注意:当设置了多个savemn命令时,其中任意一个条件都会触发持久化。比如我们设置如下两条savemn命令:save6010save6001当Rediskey值在60s内变化10次时,会触发持久化;如果Redis的key值在60s内变化小于10次,那么Redis会判断Redis的key值在600s内是否至少被修改过一次,如果是则触发持久化。②flushallflushall命令用于清空Redis数据库。在生产环境中必须谨慎使用。当Redis执行flushall命令时,会触发自动持久化,清除RDB文件。执行结果如下图所示:③触发主从同步在Redis主从复制中,当从节点进行全量复制操作时,主节点会执行bgsave命令,将RDB文件发送给从节点节点,这将自动触发RedisPersistence。4、配置说明合理设置RDB配置,可以保证Redis的高效稳定运行。我们来看看RDB的配置项。RDB配置参数可以在Redis配置文件中找到。具体内容如下:#RDB保存条件save9001save30010save6010000#bgsave失败后是否停止持久化数据到磁盘,yes表示停止持久化,no表示忽略错误继续写入文件。stop-writes-on-bgsave-erroryes#RDB文件压缩rdbcompressionyes#读写文件时是否开启RDB文件检查,检查是否有损坏,启动时发现损坏则停止启动。rdbchecksumyes#RDB文件名dbfilenamedump.rdb#RDB文件目录dir./其中比较重要的参数罗列如下:①save参数用于配置触发RDB持久化条件的参数。当满足保存条件时,数据将持久化到硬盘。默认配置说明如下:save9001:如果900秒内至少有1个key值发生变化,则数据持久化到硬盘;save30010:如果300秒内至少有10个键值发生变化,则将数据Persist到硬盘;save6010000:表示如果60秒内至少有10000个键值变化,数据会持久化到硬盘。②rdbcompression参数默认值为yes,表示开启RDB文件压缩,Redis会使用LZF算法进行压缩。如果不想为文件压缩消耗CPU性能,可以设置关闭该功能。这样做的缺点是需要更多的磁盘空间来保存文件。③rdbchecksum参数默认值为yes,表示是否开启读写文件时的RDB文件检查,检查是否有损坏。如果在启动过程中发现检查损坏,请停止启动。5、配置查询在Redis中,可以通过命令来查询当前的配置参数。查询命令格式为:configgetxxx。比如想要获取RDB文件的存储名称设置,可以使用configgetdbfilename。执行效果如下图:查询RDB的文件目录,可以使用命令configgetdir查看执行效果如下图:6.配置设置设置RDB配置,可以使用以下两种方法:configsetdir"/usr/data"注意:手动修改Redis配置文件的方法是全局有效的,即重启Redis服务器设置参数不会丢失,修改的方法Redis重启后,它和命令一起丢失。但是,如果手动修改Redis配置文件,需要重启Redis服务器才能立即生效,而命令方式不需要重启Redis服务器。Tips:Redis配置文件位于Redis安装目录的根路径下,默认名称为redis.conf。7、RDB文件恢复当Redis服务器启动时,如果Redis根目录下有RDB文件dump.rdb,Redis会自动加载RDB文件来恢复持久化数据。如果根目录下没有dump.rdb文件,请先将dump.rdb文件移动到Redis的根目录下。验证是否加载了RDB文件。Redis启动时有日志信息,会显示RDB文件是否加载。我们执行Redis启动命令:src/redis-serverredis.conf,如下图所示:从日志中可以看出,Redis服务启动时已经正常加载了RDB文件。Tips:当Redis服务器加载RDB文件时,会被阻塞,直到加载工作完成。八、RDB的优缺点1)RDB的优点RDB的内容是二进制数据,占用内存少,比较紧凑,更适合作为备份文件;RDB对于容灾非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器上进行Redis服务恢复;RDB可以更大程度的提高Redis的运行速度,因为Redis主进程每次持久化都会fork()一个子进程将数据持久化到磁盘,而Redis主进程不进行磁盘I/O等操作将被执行;与AOF格式文件相比,RDB文件可以更快的重启。2)RDB的缺点由于RDB只能在一定时间间隔保存数据,如果Redis服务中途意外终止,Redis一段时间内的数据会丢失;RDB需要经常fork()以使用子进程将其持久化在磁盘上。如果数据集很大,fork()可能会很耗时,如果数据集很大且CPU性能很差,则可能导致Redis停止为客户端提供几毫秒甚至一秒的服务。9.禁用持久化禁用持久化可以提高Redis的执行效率。如果对数据丢失不敏感,可以在客户端连接时执行configsetsave""命令禁用Redis持久化,如下图所示:10.总结通过本文我们可以知道RDB持久化分为手动触发和自动触发两种方式。它的优点是存储文件小,Redis启动时恢复数据比较快。缺点是存在数据丢失的风险。.RDB文件的恢复也很简单。你只需要将RDB文件放在Redis的根目录下,Redis启动时会自动加载和恢复数据。11、思考题如果Redis服务器CPU占用率过高,可能是什么原因造成的?欢迎在评论区写下你的答案。