Redis持久化

RDB快照

在默认情况下,Redis将内存数据库快照保存到dump.rdb的二进制文件中。

可以对Redis进行设置,让它在“N秒内数据集至少有N个改动”, 这一条件被满足时,自动保存一次数据集。比如说:让Redis满足“60秒内至少有1000个键被改动”这一个条件时,自动保存一次数据集。

save 60 1000

除了在配置文件中使用save关键字设置RDB快照,还可以在命令行中手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件。

每次执行命令都会将所有redis内存快照保存到一个rdb文件里,并覆盖原有的rdb快照文件。

save是同步命令,bgsave是异步命令,bgsave会从redis主进程fork出一个子进程专门用来生成rdb二进制文件。

AOF(append only file)

快照功能并不是非常durable,如果redis因为某些原因而造成故障停机,那么服务器将丢失最近写入且未保存到快照中的那些数据。从1.1版本,redis增加了一种完全durable的方式:AOF持久化,将修改的每一条指令记录进appendonly.aof中。修改配置文件来打开aof功能:

appendonly yes

打开aof功能,每当redis执行一个改变数据集的命令时,这个命令就会追加到aof文件的末尾。这样的话,当redis重新启动时,程序就会通过执行aof文件中的命令来达到重建数据集的目的。

可以配置redis多久才将命令持久化到磁盘一次。

appendfsync always:每次有新命令追加到aof文件时就执行一个持久化,非常慢但是安全
appendfsync everysec:每秒执行一次持久化,足够快(和使用rdb持久化差不多)并且在故障时只会丢失1秒钟的数据
appendfsync no:从不持久化,将数据交给操作系统来处理。redis处理命令速度加快但是不安全。

默认情况下 ,每秒执行一次fsync, 这种fsync策略可以兼顾安全性和速度。

rdb和aof的区别:

redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof文件一般来说数据更安全一点。

二、AOF重写

aof文件里可能有太多“琐碎”指令,所以aof会定期根据内存的最新数据重新生成aof文件

有两个配置可以控制aof自动重写的频率:

auto-aof-rewrite-min-size 64mb: aof文件至少要达到64m才会触发制动重写,文件太小恢复速度本来就很快,重写的意义不大

auto-aof-rewrite-percentage 100:aof文件上一次重写后文件大小增长了100%则再次触发重写

当然aof还可以手动重写,进入redis客户端执行命令bgrewriteaof重写aof。

触发aof重写时,redis会fork一个子进程去做,不会对redis正常命令处理有太多影响。

Redis 4.0混合持久化

重启redis恢复数据集时,很少会使用rdb来恢复内存状态,因为会丢失大量数据。通常会使用aof日志恢复数据,但是重放aof日志性能相对rdb来说要慢很多,这样在redis实例很大的情况下,启动需要花费很长时间。Redis4.0为了解决这个问题,带来了新的持久化选项——混合持久化。

aof-use-rdb-preamble yes

混合持久化aof文件结构:

如果开启了混合持久化,aof在重写时,不再是单纯将内存数据转换为RESP命令写入aof文件,而是将重写这一刻之前的内存做rdb快照处理,并且将rdb快照内容和增量的aof修改内存数据的命令存在一起,都写入新的aof文件,新的aof文件一开始不叫appendonly.aof,等到重写完成后,新的aof文件才会进行改名,原子的覆盖原有的aof文件,完成新旧两个aof文件的替换。

于是在redis重启的时候,可以先加载rdb文件,然后再重放增量的aof日志就可以完全替代之前的aof全量文件重放,因此重启效率大幅得到提高。

还没关注我的公众号?

  • 扫文末二维码关注公众号【小强的进阶之路】可领取如下:
  • 学习资料: 1T视频教程:涵盖Javaweb前后端教学视频、机器学习/人工智能教学视频、Linux系统教程视频、雅思考试视频教程;
  • 100多本书:包含C/C++、Java、Python三门编程语言的经典必看图书、LeetCode题解大全;
  • 软件工具:几乎包括你在编程道路上的可能会用到的大部分软件;
  • 项目源码:20个JavaWeb项目源码。

最新文章

  1. java socket 网络编程常见异常
  2. kafka的一些认识
  3. SIP 状态码
  4. sysfs->sys简单介绍
  5. Qt信号槽中槽函数为虚函数的一些感想
  6. QT解析命令行(QCommandLineOption和QCommandLineParser类)
  7. How to get the file in a resource folder
  8. tar+pigz+ssh实现大数据压缩传输
  9. Python实战之列表list的详细简单练习2
  10. 996.ICU 写给... 写给年轻的自己
  11. MySQL SET数据类型
  12. 探索未知种族之osg类生物---渲染遍历之器官协作
  13. sczd
  14. Day3--Python--字符串,for循环,迭代
  15. java.lang.RuntimeException: Cannot create a secure XMLInputFactory 异常处理
  16. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
  17. 用css 实现凹陷的线条
  18. 批量更新 A表的PK_ID字段
  19. rabbitmq延迟队列相关
  20. HDU - 4336:Card Collector(min-max容斥求期望)

热门文章

  1. 03.Django基础三之视图函数
  2. 复习0824js
  3. php数据提交POSt
  4. PHP操作redis 【转】
  5. 使用flask-mail扩展发送邮件
  6. python的元组存储的实质和多元赋值
  7. 基于python的scrapy环境搭建
  8. 数据分析--numpy的基本使用
  9. 【Django】ModelForm
  10. 分布式session共享机制分析