工作3年的Java程序员,轻松拿到阿里P6Offer,只因为他搞明白了Redis这几个问题!! (5)

Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种,也可以将这两种方式结合使用。

RDB:根据指定的规则“定时”将内存中的数据存储在硬盘上,

AOF:每次执行命令后将命令本身记录下来。

4.3.1 RDB模式

RDB的持久化方式是通过快照(snapshotting)完成的,它是Redis默认的持久化方式,配置如下。

# save 3600 1 # save 300 100 # save 60 10000

Redis允许用户自定义快照条件,当符合快照条件时,Redis会自动执行快照操作。快照的条件可以由用户在配置文件中配置。配置格式如下

save <seconds> <changes>

第一个参数是时间窗口,第二个是键的个数,也就是说,在第一个时间参数配置范围内被更改的键的个数大于后面的changes时,即符合快照条件。当触发条件时,Redis会自动将内存中的数据生成一份副本并存储在磁盘上,这个过程称之为“快照”,除了上述规则之外,还有以下几种方式生成快照。

根据配置规则进行自动快照

用户执行SAVE或者GBSAVE命令

执行FLUSHALL命令

执行复制(replication)时

根据配置规则进行自动快照

修改redis.conf文件,表示5秒内,有一个key发生变化,就会生成rdb文件。

save 5 1 # 表示3600s以内至少发生1个key变化(新增、修改、删除),则重写rdb文件 save 300 100 save 60 10000

修改文件存储路径

dir /data/program/redis/bin

其他参数配置说明

参数 说明
dir   rdb文件默认在启动目录下(相对路径) config get dir 获取  
dbfilename   文件名称  
rdbcompression   开启压缩可以节省存储空间,但是会消耗一些CPU的计算时间,默认开启  
rdbchecksum   使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。  

如果需要关闭RDB的持久化机制,可以参考如下配置,开启save,并注释其他规则即可

save "" #save 900 1 #save 300 10 #save 60 10000 用户执行SAVE或者GBSAVE命令

除了让Redis自动进行快照以外,当我们对服务进行重启或者服务器迁移我们需要人工去干预备份。redis提供了两条命令来完成这个任务

save命令

如图4-24所示,当执行save命令时,Redis同步做快照操作,在快照执行过程中会阻塞所有来自客户端的请求。当redis内存中的数据较多时,通过该命令将导致Redis较长时间的不响应。所以不建议在生产环境上使用这个命令,而是推荐使用bgsave命令

image-20210712184050955

图4-24

bgsave命令

如图4-25所示,bgsave命令可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。执行BGSAVE后,Redis会立即返回ok表示开始执行快照操作,在redis-cli终端,通过下面这个命令可以获取最近一次成功执行快照的时间(以 UNIX 时间戳格式表示)。

LASTSAVE

1:redis使用fork函数复制一份当前进程的副本(子进程)

2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件

3:当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

注意:redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。 这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。

bgsave是异步执行快照的,bgsave写入的数据就是for进程时redis的数据状态,一旦完成fork,后续执行的新的客户端命令对数据产生的变更都不会反应到本次快照

Redis启动后会读取RDB快照文件,并将数据从硬盘载入到内存。根据数据量大小以及服务器性能不同,这个载入的时间也不同。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxjsd.html