前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >redis持久化

redis持久化

作者头像
changan
发布于 2021-04-19 09:30:16
发布于 2021-04-19 09:30:16
7280
举报

AOF 机制 (Append Only File)

flush时间配置

AOF 配置项 appendfsync 的三个可选值:

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

简单来说,AOF 重写机制就是在重写时,Redis 根据数据库的现状创建一个新的 AOF 文件,也就是说,读取数据库中的所有键值对,然后对每一个键值对用一条命令记录它的写入。

重写的过程

  • 从主进程中fork出子进程,并拿到fork时的AOF文件数据写到一个临时AOF文件中
  • 在重写过程中,redis收到的命令会同时写到AOF缓冲区和重写缓冲区中,这样保证重写不丢失重写过程中的命令
  • 重写完成后通知主进程,主进程会将AOF缓冲区中的数据追加到子进程生成的文件中
  • redis会原子的将旧文件替换为新文件,并开始将数据写入到新的aof文件上
AOF 重写的操作系统过程

fork子进程,fork这个瞬间一定是会阻塞主线程的,fork采用操作系统提供的写实复制(Copy On Write)机制,就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题,但fork子进程需要拷贝进程必要的数据结构,其中有一项就是拷贝内存页表(虚拟内存和物理内存的映射索引表),这个拷贝过程会消耗大量CPU资源,拷贝完成之前整个进程是会阻塞的,阻塞时间取决于整个实例的内存大小,实例越大,内存页表越大,fork阻塞时间越久。

拷贝内存页表完成后,子进程与父进程指向相同的内存地址空间,也就是说此时虽然产生了子进程,但是并没有申请与父进程相同的内存大小。那什么时候父子进程才会真正内存分离呢?“写时复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会产生阻塞的风险,就是下面介绍的场景。

fork出的子进程指向与父进程相同的内存地址空间,此时子进程就可以执行AOF重写,把内存中的所有数据写入到AOF文件中。但是此时父进程依旧是会有流量写入的,如果父进程操作的是一个已经存在的key,那么这个时候父进程就会真正拷贝这个key对应的内存数据,申请新的内存空间,这样逐渐地,父子进程内存数据开始分离,父子进程逐渐拥有各自独立的内存空间。

因为内存分配是以页为单位进行分配的,默认4k,如果父进程此时操作的是一个bigkey,重新申请大块内存耗时会变长,可能会产阻塞风险。另外,如果操作系统开启了内存大页机制(Huge Page,页面大小2M),那么父进程申请内存时阻塞的概率将会大大提高,所以在Redis机器上需要关闭Huge Page机制。Redis每次fork生成RDB或AOF重写完成后,都可以在Redis log中看到父进程重新申请了多大的内存空间。

快照

理论跟 aof重写机制类似, fork之后,遍历k-v按照一定格式做镜像;后面在按照这个镜像恢复

混合使用 AOF 日志和内存快照

内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

风险

如果Redis进程绑定了CPU,那么子进程会继承父进程的CPU亲和性属性,子进程必然会与父进程争夺同一个CPU资源,整个Redis Server的性能必然会受到影响!所以如果Redis需要开启定时RDB和AOF重写,进程一定不要绑定CPU。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Java反编译Jar包 jd-gui 与 Idea自带工具反编译jar包!
下载地址:https://gitee.com/li_kun_zang/jd-gui/releases/v1.6.6
收心
2022/04/19
3.3K0
Java反编译Jar包 jd-gui 与 Idea自带工具反编译jar包!
JD-GUI和JAD对War包和Jar包进行反编译教学
JD-GUI和JAD是两个用于反编译Java字节码的工具。它们通常在以下情况下使用:
绿毛龟
2024/01/19
3.6K0
JD-GUI和JAD对War包和Jar包进行反编译教学
反编译Apk得到Java源代码
转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html
听着music睡
2019/02/20
2.2K0
SpringBoot-Jar包分离
(1)按照正常的springboot项目打包方式,对项目进行打包package,其打包后目录如下:
星辰sea
2022/10/29
7350
SpringBoot-Jar包分离
(Mac)反编译Android APK详细操作指南[ApkTool,dex2jar,JD-GUI]
早在4年前我曾发表过一篇关于《Android开发之反编译与防止反编译》的文章,我在该文章中对如何在Windows平台反编译APK做了讲解,如今用Mac系统的同学越来越多,也有很多朋友问我能否出一篇关于
CrazyCodeBoy
2018/05/15
3.5K0
JD-GUI 反编译jar包
如果出现无法验证开发者,你确定要运行此软件吗提示则到设置中点击允许,这里会弹出是否允许
javaNice
2023/11/22
8580
[1038]dex2jar+jd-gui工具反编译安卓apk
dex2jar 这个工具用于将dex文件转换成jar文件 下载地址:http://sourceforge.net/projects/dex2jar/files/
周小董
2021/08/05
1.3K0
SpringBoot打包部署解析:jar包的生成和结构
SpringBoot项目支持两种常见的打包形式: jar 包和 war 包。默认情况下创建的 Spring Boot项目是采用 jar 包形式,如果项目需要 war 包,可通过修改配置打成 war 包。
愿天堂没有BUG
2022/10/28
1.9K0
SpringBoot打包部署解析:jar包的生成和结构
当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。
Java极客技术
2023/02/23
7930
当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
SpringBoot Jar包瘦身 - 跟大文件说再见!
SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼、就是 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦
云扬四海
2019/08/06
1.8K0
Android安全机制之反编译
今天我们就来探讨一下反编译,其实反编译在我一开始学习Android的时候就听说过,但是一直没有去尝试。初次接触应该就是那次“蜻蜓FM v5.0.1 apk”事件了( 此处应有掌声(¯ □ ¯) )。那时根据网上的教程第一次反编译了“蜻蜓FM”的apk,看到了传说中的“普罗米修斯方法”以及“宙斯类”(不得不感慨开发小哥的智商)。之后就是在阅读《Android群英传》时也有相关反编译的内容,觉得有必要记录一下。所以这就是本片写博文的起源了。
俞其荣
2022/07/28
3980
Android安全机制之反编译
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
大家开发的基于Spring Boot 的应用 ,jar形式, 发布的时候,绝大部分都是使用java -jar 启动。 得益于Spring Boot 的封装 , 再也不用操心搭建tomcat等相关web容器le , 一切变得非常美好, 那SpringBoot是怎么做到的呢?
小小工匠
2021/08/17
1.6K0
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
JD-GUI 反编译工具:探索 Java 字节码的奇妙世界
在 Java 开发领域中,经常会遇到需要查看已编译的 Java 类文件的情况。然而,已编译的类文件通常以二进制形式存在,不可直接阅读和理解。幸运的是,有一款强大而易用的工具,它可以帮助我们将这些类文件转换为可读的 Java 源代码。它就是 JD-GUI(Java Decompiler GUI)。
高久峰
2023/06/29
1.8K0
【小工具】反编译指南
相信在大学学习过编译原理这门课程的小伙伴都看过这段话,“编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序,翻译为计算机能解读、运行的低级语言的程序,也就是可执行文件。那么反之,我们亦可以通过低级语言进行反向工程,获取其源代码。这个过程,就叫做反编译。”
用户9913368
2022/08/13
2.9K0
【小工具】反编译指南
android反编译apk_apk反编译找不到
APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境,推荐使用JDK1.6或者JDK1.7。
全栈程序员站长
2022/10/01
1.5K0
linux上对jar包的操作
vim xxx.jar 该命令首先会列出全部文件,可以通过输入/abc来搜索,定位到对应的abc文件后回车进入配置文件内进行编辑,:wq保存。
用户7741497
2022/03/14
2.9K0
APK逆向工程
APK(android Application PacKage)文件是安卓app的安装文件,其实就是一个zip或rar压缩包,把apk后缀改为zip,即可解压得到一堆安卓相关文件。
李小白是一只喵
2020/11/24
1.2K0
APK逆向工程
【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
学习 Android 安全 , 首先要了解常用的破解 Android 应用的方式 , 本篇博客中简单介绍了破解 Android 应用的
韩曙亮
2023/03/28
3.1K0
【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
jar包与war包的区别
jar包:对于学习java的人来说应该并不陌生。我们也经常使用也一些jar包。其实jar包就是java的类进行编译生成的class文件就行打包的压缩包而已。里面就是一些class文件。当我们自己使用maven写一些java程序,进行打包生成jar包。同时在可以在其他的工程下使用,但是我们在这个工程依赖的jar包,在其他工程使用该jar包也要导入。
全栈程序员站长
2022/08/31
1.4K0
jar包与war包的区别
.Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一、最简单的方法(类似我们的winfrom) 只要我们调试或者运行过项目,在项目下的bin debug下就有同名apk文件了(Eclipse)下是这样的。在Android下变成了\app\build\apk下了 当然我们不能把这个apk放在商店。没有签名会被人家的apk替换 二、签名发布 1.签名的意义   为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同
用户1149182
2018/01/16
9440
.Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
推荐阅读
相关推荐
Java反编译Jar包 jd-gui 与 Idea自带工具反编译jar包!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档