天天看点

Redis 持久化RDB与AOF(一) :RDB

Redis 持久化RDB与AOF(二) :AOF

1、介绍

redis也是要将数据持久化,为的就是当redis重启时可以将持久化的数据重新读入到内存中。持久化又分 **RDB(Redis Database)**和 **AOF(Append Only File)**两种方式,两种方式各有千秋,因环境而异。

2、RDB持久化方式

rdb是redis默认开启的持久化方式,通过配置规则来持久化数据。在持久化时Redis会Fork(相当于复制)一个子进程进行将内存中的数据写入到零时文件,等全部都写完再替换上一次持久化的文件。

2.1 配置文件

在配置文件 SNAPSHOTTING 这一项下面就有案例,我们可以看到格式为 save <秒数> <改变数> ;其中 save为固定写法,后面两个参数描述的是 在多少秒改变多少个元素后,在这个规则秒数最后一秒执行保存;比如你Redis是12:04:04秒启动的,然后我配置的规则是 save 120 2 ,当我改变了2个以上元素后并不会马上执行,而是等到 12:06:03秒才执行!

################################ SNAPSHOTTING  ################################
	#   Save the DB on disk:
	#   save <seconds> <changes>
    save 900 1               # 900秒内发生了一次改变元素会保存,
    save 300 10				 # 300秒内发生了10次改变元素会保存
    save 60 10000			 # 60秒内发生了10000次改变元素会保存
           

2.2、rdb文件介绍

rdb文件是由子进程创建的,里面包含的是最后一次写入的内存数据

2.2.1、配置rdb生成的目录介绍
# dbfilename 用于配置rdb文件生成后的名称。 生成的路径为 dir/dbfilename 例如:/home/qiaolin/dump.rdb
dbfilename dump.rdb

# rdb和后面说的aof方式生成的文件默认都会放到该目录下,dir默认为 ./ 其实也就是说以你启动redis-server的目录为工作目录
# 由于redis所在的目录配置了环境变量,我可以在任何地方启动;例如:我在 /home/qiaolin/ 下 
# 运行 redis-server /config/redis.config 这时候我redis的工作目录就为 /home/qiaolin/ 
dir ./

# 你可以通过redis-cli客户端连接到这个redis-server 执行 config get dir 获取到当前工作目录
# 你也可以通过执行 config set dir 新工作目录  来切换工作目录
           
2.2.2、修复rdb文件

在子进程将内存中的数据写入到rdb文件的时候可能会出现异常情况,例如断电,网络延迟导致文件没写全;当Redis重启读该备份文件时就会出错。Redis也提供了修复的工具,一般会跟 redis-server存在相同目录下。当我们rdb文件出现问题时可以执行修复命令。

redis-check-dump 你的rdb文件 
           

3、触发持久化

上面我们说到达到了多少秒修改多少元素时会执行rdb方式的持久化操作,这是属于自动的,按照官方的配置如果你只改变了一个元素需要等待900秒也就是15分钟才会将当前内存中的数据Fork(复制)子进程然后写入零时文件覆盖原dump.rdb文件,有时候我们就想立刻保存,那怎么办!其实有即可命令可以实现立刻保存!

命令 说明
save 主进程进行保存,这时候写入数据的操作会阻塞
bgsave 跟自动触发一样,子进程进行保存
flushall 清空全部db时,会把你得dump.rdb清空, 而 flushdb不会,他还是会等待触发条件达成
shutdown 关闭redis-server 此时会进行rdb持久化

4、优势

生成的rdb文件体积小,恢复起来数据比较快,我们可以打开生成的 dump.rdb查看,里面都是很精简的数据

Redis 持久化RDB与AOF(一) :RDB

5、劣势

1、在达到执行条件时会Fork(复制)主进程产生一个子进程 ,子进程中也拥有一份跟主进程一摸一样的数据,也就是数据多了一倍。

2、如果你修改了几个元素,但是还没达到条件持久化并且此时redis挂掉了,此时就会丢失最后操作的数据。

6、关闭RDB持久化

两种方式

1、修改配置文件注释持久化规则

################################ SNAPSHOTTING  ################################
	#   Save the DB on disk:
	#   save <seconds> <changes>
    # save 900 1               # 900秒内发生了一次改变元素会保存,
    # save 300 10				 # 300秒内发生了10次改变元素会保存
    # save 60 10000			 # 60秒内发生了10000次改变元素会保存
           

2、关闭rdb持久化方式,我们需要在 redis-cli 连接内执行命令

查看当前规则:

7、其他补充

1、当你同时开启 rdb 和 aof 方式时,redis不会加载你得 dump.rdb 备份文件,即使 aof持久化文件不存在!

继续阅读