Redis数据持久化

本文介绍Redis持久化,包括RDB和AOF两种方案。RDB可定期生成数据集快照,AOF记录写操作命令。文中阐述了两种方案的配置方法,如RDB可通过命令或配置文件设置,AOF可手动触发或定期自动重写。还对二者进行比较,并给出测试注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis持久化

#1 持久化方式

Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

#1.1 RDB

Redis会定期保存数据快照至一个rbd文件中,并在启动时自动加载rdb文件,恢复之前保存的数据

# 配置
  • 方式一 :

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

BGSAVE是通过redis调用fork来创建一个子进程,然后子进程负责将快照写入磁盘,而父进程仍然继续处理命令。

SAVE是在没有足够的内存空间去执行BGSAVE或者无所谓等待的时候。执行SAVE命令过程中,redis不在响应任何其他命令。

  • 方式二(常用) :

在redis.conf中设置save配置选项

save [seconds] [changes]
# save 60 100

会让Redis每60秒检查一次数据变更情况,如果发生了100次或以上的数据变更,则进行RDB快照保存。可以配置多条save指令,让Redis执行多级的快照保存策略。Redis默认开启RDB快照。

注意:

  • 当Redis通过shutdown命令关闭服务器请求时,会执行SAVE命令创建一个快照,如果使用kill -9 PID将不会创建快照

#1.2 AOF

采用AOF持久方式时,Redis会把每一个写请求都记录在一个日志文件里。在Redis重启时,会把AOF文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。

# 配置

AOF默认是关闭的

appendonly yes

随着AOF不断地记录写操作日志,因为所有的操作都会记录,所以必定会出现一些无用的日志。大量无用的日志会让AOF文件过大,也会让数据恢复的时间过长。不过Redis提供了AOF rewrite功能,可以重写AOF文件,只保留能够把数据恢复到最新状态的最小写操作集。

AOF rewrite可以通过BGREWRITEAOF命令触发,也可以配置Redis定期自动进行:

auto-aof-rewrite-percentage
100auto-aof-rewrite-min-size 64mb

上面两行配置的含义是,Redis在每次AOF rewrite时,会记录完成rewrite后的AOF日志大小,当AOF日志大小在该基础上增长了100%后,自动进行AOF rewrite。同时如果增长的大小没有达到64mb,则不会进行rewrite。

# 在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。redis中默认为no  
no-appendfsync-on-rewrite no   
# 当前AOF文件大小是上次日志重写时的AOF文件大小两倍时,发生BGREWRITEAOF操作。  
auto-aof-rewrite-percentage 100  
#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF。  
auto-aof-rewrite-min-size 64mb  
# Redis再恢复时,忽略最后一条可能存在问题的指令(因为最后一条指令可能存在问题,比如写一半时突然断电了)
aof-load-truncated yes
#Redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
aof-use-rdb-preamble no

#1.3 比较

RDB与AOF同时开启 默认先加载AOF的配置文件,因此需要根据具体情况使用,4.0+的可以使用RDB-AOF混合持久化格式

#2 测试

小坑

  • 修改redis配置文件redis.con后,启动redis-server时,一定要带上修改后的redis.conf,否则配置文件不生效
# 原来启动redis
./redis-server
# 修改配置文件后启动redis,带上你的redis.conf的绝对路径
./redis-server /path/to/redis.conf 

#2.1 RDB (默认开启)

# RDB开启测试(默认开启)

往redis写入数据,重启后redis中的数据还在

20190507124835-image.png


20190507125047-image.png


20190507124617-image.png

# RDB关闭

关闭RDB有两种方式:

  • 修改配置文件redis.conf
...
save ""

# save 900 1
# save 300 10
# save 60 10000
...

  • 在redis-cli (redis客户端) 修改配置
config set save ""

无论以哪种方式修改,再次启动redis-server时,都要带上redis.conf文件


20190507124850-image.png


20190507125027-image.png


注意: 关闭RDB只是在关闭之后,不会将数据快照保存到rdb文件中,而之前的文件仍然会有以前的数据,在重启之后,以前的数据还是会恢复

#2.1 AOF (默认关闭)

# 把no改成yes
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
# 每秒一次(默认)
appendfsync everysec 

20190507133354-image.png


20190507133400-image.png


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值