当前位置: 首页 > article >正文

Redis持久化详解

Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到磁盘来保证持久化,避免因某些原因(比如突然断电)造成的数据丢失问题,即保证数据的安全性。Redis支持两种持久化方式,一种是RDB(快照)也是默认方式,另一种是AOF(Append-only file)的方式。

一、RDB简介

  RDB是Redis DataBase缩写,功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数。RDB持久化是把当前进程数据生成快照保存到硬盘的过程
在这里插入图片描述

二、RDB的配置

<span style="color:#000000"><span style="background-color:#282c34"><code># 时间策略
save 900 1
save 300 10  #  表示300s内有10条写入,就产生快照
save 60 10000

# 文件名称
dbfilename dump.rdb

# 文件保存路径
dir /home/work/app/redis/data/

# 如果持久化出错,主进程是否停止写入(保护持久化的数据一致性问题)
stop-writes-on-bgsave-error yes

# 是否压缩
rdbcompression yes

# 导入时是否检查
rdbchecksum yes
</code></span></span>

三、RDB的原理

  在Redis中RDB持久化的触发分为两种:手动触发与定时触发

1、手动触发

  • save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。

  • bgsave:该触发方式会fork一个子进程由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候

2、自动触发

  • 根据我们的 save m n 配置规则自动触发;

  • 从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave;

  • 执行 debug reload 时;

  • 执行 shutdown时,如果没有开启aof,也会触发。

3、bgsave的持久化过程

在这里插入图片描述
  这里注意的是 fork 操作会阻塞,导致Redis读写性能下降。我们可以控制单个Redis实例的最大内存,来尽可能降低Redis在fork时的事件消耗。以及上面提到的自动触发的频率减少fork次数,或者使用手动触发,根据自己的机制来完成持久化。

四、AOF简介

  以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。主要作用:解决了数据持久化的实时性
在这里插入图片描述

五、AOF的配置

<span style="color:#000000"><span style="background-color:#282c34"><code># 是否开启aof
appendonly yes

# 文件名称
appendfilename "appendonly.aof"

# 同步方式
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof时如果有错如何处理(向客户端写入一个log,但是会继续执行)
aof-load-truncated yes

# 文件重写策略
aof-rewrite-incremental-fsync yes
</code></span></span>

六、AOF原理

在这里插入图片描述

  • 所有的写入命令会追加到aof_buf(缓冲区:减小磁盘负载)中。

  • AOF缓冲区根据对应的策略向磁盘做同步操作

  • 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

  • 当Redis服务器重启时,可以加载AOF文件进行数据恢复

存储结构:redis通讯协议(RESP )格式的命令文本存储,兼容性好、追加方便、可读性高。

七、从持久化中恢复数据

  数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?其实想要从这些文件中恢复数据,只需要重新启动Redis即可。
在这里插入图片描述
  启动时会先检查AOF文件是否存在,如果不存在就尝试加载RDB。那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道AOF基本上最多损失1s的数据。

八、两种持久化方法的优缺点及优化

1、AOF的优点

  • 最安全,在启用appendfsync always时,任何已写入的数据都不会丢失,使用在启用appendfsync everysec也至多只会丢失1秒的数据。AOF文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。

  • AOF文件易读,可修改,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。

2、AOF的缺点:

  • AOF文件通常比RDB文件更大

  • 性能消耗比RDB高;

  • 数据恢复速度比RDB慢。

3、RDB的优点

  • 对性能影响最小。如前文所述,Redis在保存RDB快照时会fork出子进程进行,几乎不影响Redis处理客户端请求的效率。

  • 每次快照会生成一个完整的数据快照文件,所以可以辅以其他手段保存多
    个时间点的快照(例如把每天0点的快照备份至其他存储媒介中),作为非常可靠的灾难恢复手段

  • 使用RDB文件进行数据恢复比使用AOF要快很多

4、RDB的缺点

  • 快照是定期生成的,所以在Redis crash时或多或少会丢失一部分数据

  • 如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力。

转发自:Redis持久化详解-CSDN博客


http://www.kler.cn/a/470661.html

相关文章:

  • Spring Boot教程之五十一:Spring Boot – CrudRepository 示例
  • 如何用代码提交spark任务并且获取任务权柄
  • 【游戏设计原理】53 - 解决问题的障碍
  • RAFT:随机退火森林
  • [Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
  • tcpdump-命令详解
  • HTML5 弹跳动画(Bounce Animation)详解
  • 基于Vue的农业设备租赁系统设计与实现(LW+源码+讲解)
  • 【性能优化】如何提升页面加载速度?
  • Ubuntu 20.04安装gcc
  • Java高频面试之SE-08
  • 千兆宽带和全屋WiFi覆盖
  • jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例
  • 【Spring Boot】统一数据返回
  • 『SQLite』表连接查询
  • iPhone升级iOS18黑屏?2025最新修复办法分享
  • docker学习记录:commit,制作自己的镜像
  • SSL,TLS协议分析
  • 深度学习在网络拓扑优化中的应用:智能化网络管理的新前沿
  • R语言基础| 中级绘图
  • CCNP_SEC_ASA 第七天作业
  • 使用Python实现网络安全攻击检测系统
  • 进制转换(蓝桥杯)
  • 【C/C++】Protobuf与nlohmann/json的比较
  • 【Uniapp-Vue3】常用的表单组件button和input
  • SpringBoot2 如何集成OpenAPI