Redis 如何持久化

Redis 如何持久化

redis 如何持久化

1.RDB(快照) 保存某个时间的全量数据快照

图片

保存策略

save 900 1

900秒内提交了一条数据,就产生一次快照

save 300 10

300秒内提交了10条数据,就产生一次快照

save 60 10000

60秒内提交了10000条数据,就产生一次快照

为什么定义这么多策略?
应付不同的环境

stop-writes-on-bgsave-error yes

当备份进程报错时,就停止写入进程.保护持久化数据一致性的问题.如果自己的业务有完善的监护系统,可以关闭此选项

rdbcompression yes

再备份的时候,将rdb文件进行压缩再保存.建议设置成no,因为redis本身就属于cpu密集型服务器,再开启压缩会带来更多cpu消耗,相比硬盘成本,cpu更值钱

如果你想要禁用RDB配置,也是非常容易的,只需要在save的最后一行写上:save ""

2.RDB(快照) 持久化:保存某个时间的全量数据快照

  1. save: 阻塞redis的服务器进程,知道RDB文件被创建完毕.
  2. bgsave: Fork出一个子进程来创建RDB文件,不阻塞服务器进程.
127.0.0.1:6379> save
OK
(11.68s)
127.0.0.1:6379> lastsave
(integer) 1593269427
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> lastsave
(integer) 1593269464

我们可以先删除 dump.rdb文件,然后再用save保存快照.可以看到阻塞了主线程11秒. lastsave可以查看备份时间.
bgsave会立即返回,然后过段时间再使用lsatsave查看,可以看到两个返回的时间是不一样的.

3.自动化触发RDB持久化的方式

  1. 根据redis.conf配置里面的 save m n定时触发(用的是besave)
  2. 主从复制时,主节点自动触发
  3. 执行Debug Reload
  4. 执行Shutdown 且没有k开启AOF持久化

save基本不会用到,所以来看看bgsave实现原理.
bgsave

AOF(Append-Only-File)持久化,保存写状态

  1. 记录下出查询以外所有的变更数据库状态的指令
  2. 以append的形式追加保存到AOF文件中(增量)
appendonly no

# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"

# appendfsync always
appendfsync everysec
# appendfsync no

appendonly no

是否开启AOF持久化

appendfilename "appendonly.aof"

保存的文件名

appendfsync always

一旦发生缓存区的内容发生变化就写入到aof文件

appendfsync everysec

每隔一秒钟写入到aof文件

appendfsync no

根据系统策略来保存,一般是等缓存区被填满了再保存.

RDB和AOF的优缺点
RDB优点:全量数据快照,文件小,恢复快
RDB缺点:无法保存最近一次快照之后的数据
AOF优点:可读性高,适合保存增量数据,数据不容易丢失
AOF缺点:文件大,恢复时间长
RDB-AOF混合持久化方式
BGSAVE做镜像全量持久化,AOF做增量持久化