Redis持久化策略——Java全栈知识(17)

Redis持久化

1、Redis 持久化的三种方式

1、RDB: 以快照的方式将此刻 Redis 中的数据以二进制的文件形式保存在磁盘中。
RDB 的优点是:快照文件小、恢复速度快,适合做备份和灾难恢复。
RDB 的缺点是:定期更新可能会丢数据(在最后一次数据快照到服务器宕机之间的数据就会丢失)
2、AOF: AOF 是将 Redis 的所有写操作追加到 AOF 文件 (Append Only File)的结尾,从而记录了 Redis 服务器运行期间所有修改操作的详细记录。当 Redis 重新启动时,可以通过执行 AOF 文件中保存的写操作来恢复数据。
AOF 的优点是:可以实现更高的数据可靠性、支持更细粒度的数据恢复,适合做数据存档和数据备份。
AOF 的缺点是:文件大占用空间更多,每次写操作都需要写磁盘导致负载较高
3、混合模式: 在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾。
优点:解决了上述 RDB 和 AOF 的缺点
缺点:Redis 4.0 之后才支持,对低版本的不兼容

2、RDB 的执行流程

image.png

RDB 的流程:
1、当 Redis 进行 RDB 快照的时候,主进程 fork 出一个子进程。
2、子进程会把页表复制一份,真正的数据还在内存上也就是主进程和子进程共用的数据。
3、子进程将此时物理内存中的数据写入到磁盘中替换掉原来的 RDB 文件。
但是此时如果有请求来修改数据,而子进程在读和写数据到磁盘中,那么此时就会有脏读问题。
fork 采用的是 copy-on–write 技术:

  • 当主进程在读的时候,访问共享内存
  • 当主进程正在写的时候,会拷贝一份数据副本,进行写操作。
    fork 操作之后再把数据副本覆盖到数据上。

3、AOF 的三种写策略

AOF 有三种数据写回策略,分别是 Always, Everyseci 和 No。

  • Awys, 同步写回:每个写命令执行完,立马同步地将日志写回磁盘;
  • Everysec 每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘:
  • No, 操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

“同步写回”可靠性肯定是最高的,但是它在每一个写命令后都有一个落盘操作,而且还是同步的,这和直接写磁盘类型的数据库有啥区别?
"操作系统控制的写回"这种是最不靠谱的,谁知道操作系统啥时候帮你做持久化,万一没来及持久化就宕机了,不就 gg 了。
"每秒写回"是在二者之间折中了一下,异步的每秒把数据写会到磁盘上,最大程度的提升效率和降低风险。也是实际开发中使用最多的策略

4、AOF 无用写命令问题:

因为 AOF 中一条数据可能多次的写操作,只有最后一次有意义,
比如:set name 1 set name 2 set name 3 这三条命令,在恢复数据的时候只有最后一条数据有意义,如果上述无意义的写操作非常多,就会导致 AOF 的文件臃肿大多数据都是无用的。
解决方法:bgrewriteaof 命令
可以让 AOF 文件执行重写,擦去无用的写操作。

Redis 也会在触发阈值时自动去重写 AOF 文件。阈值也可以在 redis.conf 中配置:

# AOF 文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64 mb

5、AOF 和 RDB 的区别

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/682171.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stomp 实战】spring websocket 接收消息源码分析

后台消息的发送过程,我们通过spring websocket用户消息发送源码分析已经了解了。我们再来分析一下后端接收消息的过程。这个过程和后端发送消息过程有点类似。 前端发送消息 前端发送消息给服务端的示例如下: 发送给目的/app/echo一个消息。 //主动发…

mysql数据库调优篇章1

目录 1.认识数据库中日志的作用2.增加mysql数据库中my.ini 基本配置3.增加my.ini中参数配置4.查看已经执行过的sql语句过去执行时间5.找出慢查询的sql6. SHOW VARIABLES LIKE ‘innodb_read_io_threads’; SHOW VARIABLES LIKE ‘innodb_write_io_threads’; SHOW VARIABLES LI…

Python从0到POC编写--实用小脚本02

爆破脚本: 爆破脚本也是我们经常使用的东西 这里就简单讲讲后台爆破脚本的编写吧 在编写之前,我们先通过访问网站去看看情况 首先我们可以先登录看看 输入账号 admin ,密码 12345 后 登录失败,提示 用户名或密码错误 在输入…

振动分析的一些概念

一.时域分析 振动测试领域中,通常使用标准是ISO 10816系列标准,其要去使用有效值(RMS)来表示震动信号的能量大小,并提供一组限制值,以帮助用户评估机器的振动水平是否正常。 1.位移: 峰峰&…

【备战软考(嵌入式系统设计师)】10 - 软件工程基础

这一部分的内容是概念比较多,不要理解,去感受。 涉及的知识点是嵌入式系统开发和维护的部分,也就是和管理相关的,而不是具体如何进行嵌入式系统开发的细节。 系统开发生命周期 按照顺序有下面几个阶段,我们主要要记…

Android MediaCodec 简明教程(七):使用 MediaCodec 解码到 OES 纹理上

系列文章目录 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查…

书生浦语训练营第2期-第7节作业

一、基础作业 二、进阶作业

百面算法工程师 | 支持向量机面试相关问题——SVM

本文给大家带来的百面算法工程师是深度学习支持向量机的面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习算法工程师面试问题,并提供参考的回答…

嵌入式开发九:STM32时钟系统

时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道 STM32 属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时…

深圳CPDA|如何利用数据分析改进业务流程,提高效率?

在当今数字化时代,数据已经成为企业决策和优化的关键资源。通过有效地收集、分析和应用数据,企业可以深入了解其业务流程中的瓶颈和问题,从而改进流程,提高效率。本文将探讨如何利用数据分析改进业务流程,并提高效率。…

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中,企业如何快速而有效地触及并吸引潜在客户,已成为一个不可忽视的挑战。随着人工智能技术的不断进步,智能私信软件作为一种新型工具,正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件,…

在Ubuntu上安装Anaconda之后,启动失败

为了方便管理Pythonu环境,在Ubuntu的Docker容器中安装了Anaconda,安装完成,启动时出现如下错误: conda activate xxx usage: conda [-h] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: acti…