Redis持久化详解

 【关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列】所以不是单线程

Redis有两种持久化方案:

  • RDB持久化

  • AOF持久化

  • 基于Redis集群解决单机Redis存在的问题

【Redis是单进程的】

【也有人做分布式section】

【主从集群中多个从就是做负载均衡的】

单机的Redis存在四大问题:

RDB持久化

【执行 bgsave 过程中,Redis 依然可以继续处理操作命令的,也就是数据是能被修改的,关键的技术就在于写时复制技术(Copy-On-Write, COW)。

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。【全量拷贝】

1.执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:

redis-cli中执行save

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2)bgsave命令

下面的命令可以异步执行RDB:

bgsave

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

 # 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
 save 900 1  
 save 300 10  
 save 60 10000 

RDB的其它配置也可以在redis.conf文件中设置:

 # 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
 rdbcompression yes
 ​
 # RDB文件名称
 dbfilename dump.rdb  
 ​
 # 文件保存的路径目录
 dir ./ 

2.RDB原理

bgsave开始时会fork主进程得到子进程【此时主进程是阻塞的,所以要加快fork的速度】,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write(写时复制技术):内存大时还是很耗时,还需要大量磁盘IO,对性能影响大。

  • 当主进程执行读操作时,访问共享内存;

  • 当主进程执行写操作时,则会拷贝一份数据(数据副本),执行写操作。fork会把共享内存标记为read-only,以后主进程读操作时也往副本,页表变了。

【所有进程都没法操作物理内存,所以由操作系统给每个进程分配一个虚拟内存,操作系统还会维护虚拟内存和物理内存之间的映射关系表(页表),从而实现读写。fork的过程就是对页表做拷贝】

【redis一般预留空间,防止被副本翻倍消耗完】

3.小结

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间

  • 子进程读取内存数据并写入新的RDB文件

  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时

  • 代表60秒内至少执行1000次修改则触发RDB

  • 宕机数据会丢失

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险

  • fork子进程、压缩、写出RDB文件都比较耗时

AOF持久化

【大大提高数据的安全性,弥补RDB】

1.AOF原理

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。【不像RDB每次都从头开始写文件,累加】

【先写到Redis,再把命令写到AOF文件,将来恢复只需要重新执行命令】

2.AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

 # 是否开启AOF功能,默认是no
 appendonly yes
 # AOF文件的名称
 appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

 # 表示每执行一次写命令,立即记录到AOF文件,先操作内存再写到磁盘(性能最差)
 appendfsync always 
 # 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
 appendfsync everysec 
 # 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
 appendfsync no

三种刷盘策略对比:

3.AOF文件重写

【AOF执行rewrite的缓冲区。无法设置容量上限】

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令(后台子进程 bgrewriteaof来完成),可以让AOF文件执行重写功能,用最少的命令达到相同效果。

【子进程带有主进程的数据副本,这里使用子进程而不是线程,防止共享数据更改(只读)(主进程修改了会发生「写时复制」,所以用副本保证数据安全)时使用锁降低性能】

【aof文件压缩后看不懂,此时再加命令会接着写,不过不会反压缩回来】

set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。【读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到「新的 AOF 文件」】

所以重写命令后,AOF文件内容就是:mset name jack num 666

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

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

RDB与AOF对比

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

【一般两者一起用】

【RDB相当于备份,异地容灾,机房毁了,aof也废了】

【aof写磁盘多,好在是异步的】

混合

前部分是rdb,当同步过程新来的就会进行aof降低数据丢失率。

  • 兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了。

混合持久化是在AOF持久化的基础上,定期进行RDB持久化。具体实现方式是在AOF重写时,将RDB文件以二进制压缩格式写入到AOF文件的开头,之后的数据再以AOF格式追加到文件的末尾。这样,在Redis重启时,可以优先加载RDB部分的数据,快速恢复大部分数据,然后再通过AOF部分的命令来更新内存中的数据,以保证数据的完整性。

总结

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:

  • 用来做缓存的Redis实例尽量不要开启持久化功能【提高查询效率的不需要持久化,查询时再写一遍就好。对于安全性要求高的,比如分布式锁、库存、验订单的流水需要持久化(可以专门放在一个redis实例)】

  • 建议关闭RDB持久化功能,使用AOF持久化【可以混合。rdb会丢失数据】

  • 利用脚本定期在slave节点做RDB,实现数据备份

  • 设置合理的rewrite阈值,避免频繁的bgrewrite

  • 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞【主从同步时还是要fork(大量磁盘IO),rewrite也有磁盘IO且时间长,aof刷盘也需要读写磁盘。rewrite占用磁盘高会影响aof刷盘】fsync刷盘

  • 部署有关建议:

    • Redis实例的物理机要预留足够内存,应对fork和rewrite【fork可能翻倍,写时复制】

    • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力

    • 不要与CPU密集型应用部署在一起【fork等CPU要求高。es也高】

    • 不要与高硬盘负载应用一起部署。例如:数据库、消息队列


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一维信号全变分(TV)降噪方法(MATLAB)

信号降噪一直是领域研究的热点,这是一项十分有意义并且极具挑战性的工作,经过几十年来相关科研人员的共同努力,降噪技术得到了极大的发展,并在现实生活中也得到了广泛的应用。其中,许多常用的方法有:小波变…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

上位机网络通讯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法 写入NULL值到Redis缓存,以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题! 代码 2.缓存雪崩 这个概念很好理解,雪崩就是无数的…

开发者聊科学作息时间表

非常有幸对科学作息时间表app的开发者做一次采访。 问:你对科学作息时间表app满意么? 答:非常不满意,我们的设想是让他更智能,更多的提醒方式,更好的交互体验。如果作为一个闹钟他是非常不合格的&#xff0…

视图库对接系列(GA-T 1400)三、代码生成

项目准备 我们把需要的第三方包和需要生成的库引入到对应的**基础包**中对应版本号 <properties><java.version>1.8</java.version><httpclient.version>4.5</httpclient.version><httpcore.version>4.4.12</httpcore.version><…

tinyshop项目部署

参考软件测试之测试用例设计&#xff08;四&#xff09;_管理后台 测试用例-CSDN博客 1、下载xampp 2、修改apache和mysql的端口分别为4431 &#xff0c;8013和3306 3、访问页面&#xff1a;输入ip:端口号&#xff0c;出现以下页面即成功 4、安装tinyshop商城 将解压的tinys…

Chart.js四个示例

示例代码在图片后面&#xff0c;点赞加关注&#xff0c;谢谢 条形图 雷达图 折线图 圆环图 完整例子代码 具体代码在干什么看粗体加重的注释 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <me…

OceanBase Meetup北京站|跨行业应用场景中的一体化分布式数据库:AI赋能下的探索与实践

随着业务规模的不断扩张和数据处理需求的日益复杂化&#xff0c;传统数据库架构逐渐暴露出业务稳定性波动、扩展性受限、处理效率降低以及运营成本高等一系列问题。众多行业及其业务场景纷纷踏上了数据库现代化升级之路。 为应对这些挑战&#xff0c;7月6日&#xff0c;OceanB…

搭建个人博客及错误记录

搭建个人博客及错误记录 文章目录 搭建个人博客及错误记录需要用到的网址2.推荐两个参考教学视频3.发布一篇博客个人主题配置的提醒localhost拒绝连接问题解决办法ssh -T gitgithub.com失败问题解决Deployer not found:git解决 可以根据目录解决遇到的相同问题 需要用到的网址 …

德国威步的技术演进之路(下):从云端许可管理到硬件加密狗的创新

从单机用户许可证到WkNET网络浮点授权的推出&#xff0c;再到引入使用次数和丰富的时间许可证管理&#xff0c;德国威步产品不断满足市场对灵活性和可扩展性的需求。TCP/IP浮动网络许可证进一步展示了威步技术在网络时代的创新应用。借助于2009年推出的借用许可证以及2015年推出…

如何选择适合自己的笔记本电脑

在现代社会中&#xff0c;笔记本电脑已经成为人们工作、学习和娱乐的重要工具。然而&#xff0c;面对市场上琳琅满目的笔记本电脑产品&#xff0c;如何选择一款适合自己的笔记本电脑呢&#xff1f;本文将为您提供一些有用的建议。 首先&#xff0c;确定您的使用需求。不同的用户…

新手教学系列——慎用Flask-SQLAlchemy慢日志记录

在使用 Flask-SQLAlchemy 开发应用时,了解和避免潜在的问题是非常重要的。特别是在常驻进程和循环执行任务的场景下,慢查询记录功能(SQLALCHEMYRECORDQUERIES)可能会引发严重的内存泄漏问题。本文将详细介绍这个问题,并提供解决方案,帮助你在开发过程中避免掉入这些陷阱。…

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}【保姆级包括安装QT】超详细记录版 Chapter1 为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版一. 安装QT程…

深入了解自动化:聊聊什么项目适合做自动化测试?

自动化测试 什么是自动化测 什么是自动化测试&#xff1f; 随着软件产业的不断发展&#xff0c;市场对软件周期的要求越来越高&#xff0c;于是催生了各种开发模式&#xff0c;如大家熟知的敏捷开发&#xff0c;从而对测试提出了更高的要求。此时&#xff0c;产生了自动化测试…

2024年港澳台联考考生成绩数据分析来啦

分数线 出炉 2024年的港澳台联考正式出分&#xff01;根据考生成绩&#xff0c;全国联招划档线如下&#xff1a; 一、本科批次 &#xff08;一&#xff09;普通类院校&#xff08;专业&#xff09;&#xff1a;文史类365分、理工类390分&#xff08;部分院校执行高分线&#…

算法基础入门 - 2.栈、队列、链表

文章目录 算法基础入门第二章 栈、队列、链表2.1 队列2.2 栈2.3 纸牌游戏2.4 链表如何建立链表?1.我们需要一个头指针(head)指向链表的初始。链表还没建立时头指针head为空2.建立第一个结点3.设置刚创建的这个结点的数据域(左半)和指针域(右半)4.设置头指针,头指针可方便…

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数 0. 引言1. 关于m_patch2. 关于m_streamline3. 关于m_scatter4. 关于m_annotation5. 结语 0. 引言 本篇介绍下m_map中绘制多边形区域函数&#xff08;m_patch&#xff09;、绘制流…

数据库组成及原理

属性&#xff1a; 把数据库中的一个表类比成一个公司&#xff0c;那么公司里的每个人都是一个“属性”&#xff08;表中的一个字段视为一个属性&#xff09;&#xff0c;不管老板还是员工&#xff0c;只要是公司里的人&#xff0c;就都是一个属性。 主键&#xff1a; 老板就是“…