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

解决Redis数据丢失难题:深入理解RDB与AOF持久化机制

        前篇我们了解了Redis的一些基础使用,回忆一下,Redis是一个基于键值对的NoSQL数据库,所有数据都存储在内存中,所以它的读写性能非常快。但是存储在内存中的数据在服务器重启或断电情况下数据都会丢失,持久化正是为解决此问题而生,该过程将内存的数据利用快照和日志的形式保存到硬盘上,下面我们将了解RDB持久化过程:

一、RDB

1.1、RDB持久化

        RDB(Redis DataBase)持久化将当前进程数据生成快照保存到硬盘的过程,触发RDB持久化的过程分为手动触发自动触发

        快照:将Redis服务器进程的内存中此时此刻存在的所有键值对数据,像拍照的形式存储下来。类似于警方调查一个现场,拍照片记录现场情况,并试图还原案发过程

1.2、RDB手动触发

1.2.1、save命令

        该命令会阻塞当前Redis服务器,直到RDB‘持久化’过程完成为止,对于数据量庞大的内容,该过程会长时间的阻塞Redis服务器

        向Redis中插入两条数据,并执行save命令

1.2.2、bgsave命令

        Redis进程执行fork操作创建子进程,RDB持久化由子进程完成

工作流程

        执行bgsave命令,会先判断是否有其他进程在执行 fork,没有的话,父进程会调用fork()系统调用(阻塞性操作,但速度非常短暂,微秒级别),然后就clone一个子进程,子进程就会遍历内存中所有数据库和键值对,按照RDB文件格式,将其序列化,压缩并写入一个临时RDB文件(二进制),完成后对原有文件进行原子替换,最后进程发送信号给父进程表示完成。在此过程中父进程会继续响应其他命令

        删除后再次插入两个键值对:

        插入键值对:

        因为刚插入不一定立即生效,需要满足手动或自动触发后才会写入rdb文件中,执行bgsave:

1.3、RDB自动触发

1.3.1、save配置

        进入配置文件:

1.3.2、主从复制全量同步时(目前未知)
1.3.3、执行shutdown时

        如果开启了 RDB 持久化,在关闭服务器时会自动执行一次save(阻塞式),保证数据不丢失

        对Redis服务进行关闭后,立即查看dump.rdb文件可以看到,数据已被持久化写入RDB文件中

二、AOF

2.1、AOF的持久化

        AOF(Append Only File)持久化通过记录每次写操作命令来实现数据持久化,它以独立日志的形式存储所有写命令,服务重启时通过重新执行这些命令来恢复数据。有效解决了数据持久化的实时性问题

2.2、AOF的使用

2.2.1、开启AOF

        打开Linux系统,进入Redis配置文件

        输入/appendon等,匹配到下图关键词

        更改保存后,重启Redis服务即可

        注意:开启AOF后,RDB就不生效了,启动的时候不再读取RBD文件内容,而是读取上图aof文件内容进行数据的恢复

2.2.2、AOF工作流程

        AOF机制致使我们写入一个命令,其就更新一下,又要写内存,又要写硬盘,难道不会影响Redis的速度嘛?我们来看一下AOF机制的工作流程:

        实际上,AOF机制并未让工作线程把数据写入硬盘,而是先写入内存中的一个缓冲区,积累一部分数据后再根据对应策略向硬盘进行同步操作(减少IO次数,提高性能)

2.2.3、缓冲区刷新策略

        Redis提供了多种AOF缓冲区同步文件策略:

                fsync策略:针对单个文件操作,它会强制将数据同步到硬盘。fsync调用会阻塞进程,直到数据被完全写入硬盘

                write策略:该操作会触发延迟写(delayed write)机制(延迟写(Delayed Write)是一种文件系统或数据库管理中的优化技术,将数据写入操作暂时缓存在内存中,而非立即同步到磁盘)

        通俗来说,always是读入一个命令,立马写到硬盘;everysec是每一秒写入一次硬盘;no是由操作系统自行决定

2.3、重写机制

        场景:AOF文件会记录所有的命令操作,随着我们不断使用Redis各种命令,aof 文件也会越来越大,会影响我们启动Redis的速度,更可恶的是,其中还有很多冗余的操作,比如插入某个key,后来删除、更改keyvalue......,因此Redis就存在重写机制,对aof文件内容进行整理,剔除或者合并其中的冗余内容!

2.3.1、手动触发

        和RDB持久化过程类似,手动触发是调用 bgrewriteaof 命令完成

工作流程

        (1)父进程执行fork()操作创建一个子进程(2)(3.1)父进程继续负责接收请求(4)创建出来的子进程会获取父进程当前的内存数据以AOF格式写入一个新的AOF文件中,但写入的过程中,父进程新进行的操作子进程是获取不到的(3.2)父进程会把新的操作命令写入aof_rewirte_buf 内存缓冲区中(5.1)等子进程把创建时内存的数据写完并通知父进程后,(5.2)父进程再把aof_rewirte_buf 内存缓冲区的数据写入新的AOF文件(5.3)最后替换原来的AOF文件

2.3.2、自动触发

        自动触发AOF重写的时机由以下两个参数决定:

        auto-aof-rewrite-min-size:设置触发重写时的最小AOF文件大小,默认值为64MB

        auto-aof-rewrite-percentage:表示当前AOF文件大小相比上次重写时的增长比例

http://www.dtcms.com/a/490920.html

相关文章:

  • 自己买一台服务器做自己的网站浙江省城乡建设厅官方网站
  • ARM处理器指令集
  • Day64 设备树与GPIO子系统驱动开发实践
  • 贝莱德终止收购云交所,YUNC暴跌风波
  • 源码网站php重庆观音桥网站建设
  • SWE-QA:语言模型能否回答仓库级代码问题?
  • 建功能网站有没有专业做效果图的网站
  • 做网站 教程做国外网站推广
  • k8s容器java应用频繁重启问题排查 OOM方向
  • 宁夏建设工程造价网站做pc端网站新闻
  • Spring Boot + Filebeat + ELK日志在线查看
  • 使用高性能流式的库SpreadCheetah创建EXCEL文件
  • 【西瓜播放器+Vue】前端实现网页短视频:上下滑动、自动播放、显示视频信息等
  • 软件下载网站模版html软件下载手机版
  • 哪些平台可以免费推广广州百度提升优化
  • Redis-缓存问题(穿透、击穿、雪崩)
  • Mysql数据库系统库数据恢复
  • 服务器数据恢复—RAID5硬盘掉线,热备盘未启用如何恢复raid5阵列数据?
  • 在 Linux 服务器上配置 SFTP 的完整指南(2025 最新安全实践)
  • pytorch 数据加载加速
  • 网站建设平台设备荣耀手机官网
  • 调用apisix admin 接口创建资源
  • 迅为RK3568开发板OpenHarmony系统南向驱动开发手册-pdf配置 rk3568_uart_config.hcs
  • 中兴通讯的网站建设分析wordpress安装后要删除哪些文件
  • 建设银行对账单查询网站简述电子商务网站开发的主要步骤
  • ARMA模型
  • 智慧园区:引领城市未来发展新趋势
  • python命名约定 私有变量 保护变量 公共变量
  • 气泡图 vs 散点图:什么时候加第三维?
  • 西安网站开发工程师wordpress+中文版