持久化介绍

Redis 的数据都存放在内存中,如果没有配置持久化,redis 重启后数据就全丢失,于是需要开启 redis 的持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。

                         

redissave命令保存位置_持久化

Redis持久化方式:

  1. RDB持久化:方式能够在指定的时间间隔对你的数据进行快照存储。
  2. AOF持久化方式:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。

RDB方式:

客户端直接通过命令BGSAVE或者SAVE来创建一个内存快照

  •     BGSAVE调用fork来创建一个子进程,子进程负责将快照写入磁盘,而父进程仍然继续处理命令。
  •     SAVE执行SAVE命令过程中,不再响应其他命令(会阻塞其他命令)。

    在redis.conf中调整save配置选项,当在规定的时间内,Redis发生了写操作的个数满足条件会出发发生BGSAVE命令:


#900秒之内至少一次写操作
save 900 1
#300秒之内至少发生10次写操作
save 300 10
#60秒之内发生至少10000次
save 60 10000

RDB 优点和缺点:

优点:对性能影响最小(以异步的形式保存信息)、RDB文件进行数据恢复比使用AOF要快很多。

缺点:同步时丢失数据(因为根据时间间隔和发生写操作的次数保存)、如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力。

 

AOF 持久化方式:

开启AOF持久化,redis.conf中调整,默认是不开启的。

appendonly yes

#AOF策略调整
#每次有数据修改发生时都会写入AOF文件
appendfsync always

#每秒钟同步一次,该策略为AOF的缺省策略
appendfsyn everysec

#从不同步。高效但是数据不会被AOF持久化
appendfsync no

 

AOF 优点和缺点:

优点:最安全、容灾处理安全、易读,可修改

缺点:文件体积大(每次命令处理都保存)、性能消耗比RDB高(执行频次高)、数据回复速度比RDB慢

 

模拟RBD持久化快照保存:

在redis.conf中修改RDB快照的间隔时间和次数,这里修改的是3秒有2次操作就会保存一次快照,实际是redis每隔3秒就会去检查操作次数,如果大于2则会操作一次BGSAVE。

redissave命令保存位置_redis_02

 

3秒内快速操作Redis

redissave命令保存位置_持久化_03

 

日志打印,BGSAVE调用fork来创建一个子进程子进程负责将快照写入磁盘,这里显示子进程号:16310

redissave命令保存位置_网易云课堂-微专业 Java_04

 

RDB快照保存缺点演示:

操作一次Redis,这里显示b已经被保存

redissave命令保存位置_redissave命令保存位置_05

 操作一次Redis服务挂掉,然后重启服务:

                 

redissave命令保存位置_网易云课堂-微专业 Java_06

 

重新获取b,数据丢失,因为RDB是根据时间间隔和发生写操作的次数保存,这里的b还没有保存就被kill掉了,重启后redis重新加载RDB文件,里面没有b的保存数据。

                   

redissave命令保存位置_持久化_07

如果Redis是正常关闭,不是被kill掉,则会在退出的时候进行一次RDB快照保存。 

 

模拟AOF持久化保存:

在redis.conf中打开aof持久化保存配置,配置每秒同步一次数据到aof文件。

redissave命令保存位置_redis_08

执行操作:

redissave命令保存位置_持久化_09


打开保存数据持久化的文件aof,这里的数据我们是可以看明白的,并且可以去修改他,kill -9 掉程序,重启之后仍然可以获取到值

              

redissave命令保存位置_Redis_10