我拆过的坑cycx

查询一下!

为什么断电后Redis数据不会丢失

Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其他因素导致 Reids 服务宕机,在重启之后数据会丢失吗?



Redis 持久化机制

Redis 虽然是定义为一个内存数据库,但是其也支持数据的持久化,在 Redis 中提供了两种持久化机制:RDB 持久化和 AOF 持久化。



RDB 持久化机制

RDB 全称为:Redis DataBase,是 Redis 当中默认的持久化方案。当触发持久化条件时,Redis 默认会生成一个 dump.rdb 文件,Redis 在重启的时候就会通过解析 dump.rdb 文件进行数据恢复。



RDB 机制触发条件

RDB 持久化机制有两种触发方式:自动触发和手动触发。



自动触发

自动触发方式也可以分为三种:


执行 flushall 命令(flushdb 命令不会触发)时,不过此时生成的 dump 文件内的数据是空的(dump 文件还会存储一些头信息,所以文件本身是有内容的,只是没有数据),没有什么太大的实际意义。

执行 shutdown 命令时会触发生成 dump 文件。

通过配置文件自动生成,Redis 中配置文件默认配置如下,只要达到这三个条件中的任意一个,就会触发 Redis 的RDB 持久化机制。

 

save 900 1 //900秒内至少有1个key被添加或者更新

save 300 10 //300秒内至少有10个key被添加或者更新

save 60 10000 //60秒内至少有10000个key被添加或者更新

手动触发


除了自动触发,Redis 中还提供了 2 个手动触发 RDB 机制的命令(这两个命令不能同时被执行,一旦一个命令正在执行中,另一个命令会被拒绝执行):


save:这个命令会阻塞 Redis 服务器进程,直到成功创建 RDB 文件,也就是说在生成 RDB 文件之前,服务器不能处理客户端发送的任何命令。

bgsave:父进程会执行 fork 操作来创建一个子进程。RDB 文件由子进程来负责生成,父进程可以正常处理客户端发送的命令(这里也是 Redis 不仅仅只是单线程的一个体现)。

如果想要知道上一次成功执行 save 或者 bgsave 命令的时间,可以执行 lastsave 命令进行查看,lastsave 命令返回的是一个 unix 时间戳。



RDB 机制相关配置文件

除了上面提到的触发生成 rdb 文件的配置参数,RDB 持久化机制还有如下一些相关命令:


dir:rdb 文件生成目录。默认是 ./(当前目录),可以执行命令 config get dir 进行查看,如下图所示说明当前 dump 文件生成目录为 /usr/local/redis-5.0.5/bin:


在这里插入图片描述


dbfilename:rdb 文件名。默认是 dump.rdb。


rdbcompression:rdb 文件是否是 LZF 压缩文件。默认是 yes。


rdbchecksum:是否开启数据校验。默认是 yes。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright Your WebSite.Some Rights Reserved.