redis夯实之路-持久化之RDB与AOF详解

数据库

初始化服务器时会根据redisServer的dbnum属性来决定创建多少个数据库,默认为16

使用select切换数据库

客服端状态redisClient结构的db属性记录了当前的目标数据库

RedisDb结构的dict字典保存了数据库的所有键值对,这个字典被称为键空间。

crud实际上是对键空间字典来操作,还有flushdb,dbsize等命令也是通过对键空间操作来实现的

设置键的生存时间或过期时间

Setex(单位s),expire(s),pexpire(ms)可以设置键的生存时间,

Expirate,pexpirate设置键的过期时间(timestamp的时间戳)

Ttl和pttl返回键的剩余生存时间

RedisDb结构的expires字典保存了数据库的所有键的过期时间,称为过期字典。键是指向键对象的指针,值是longlong类型的整数,一个ms精度的unix时间戳

Persist可以移除键的过期时间

判断过期键

如果过期字典存在键,unix时间戳大于过期时间,键已经过期

过期键删除策略:定时删除,惰性删除,定期删除

Redis使用的是惰性删除,定期删除两种策略,获取键时检查是否过期,周期性检查

RDB和AOF:

生成RDB文件时,过期键被忽视。

载入RDB文件时,如果是主服务器,会忽视;如果是从服务器,不会忽视

AOF写入时会追加一条del命令表示删除

AOF重写时,过期键被忽视。

复制:通过从服务器get过期键时不会删除,通过主服务器get过期键时会删除,并向从服务器发送del命令

数据库通知:2.8版本新增的功能,可以通过订阅给定的频道或模式,来获取数据库键的变化,以及命令的执行情况

RDB持久化和AOF持久化

使用RDB文件或AOF文件,可以还原数据库状态

RDB

Rdb通过保存数据库中键值对来记录数据库状态

Rdb文件是一个经过压缩的二进制文件

使用save或者bgsave生成RDB文件,save直接阻塞服务器,bgsave派生子进程创建RDB文件(bgsave命令执行期间禁用save,bgsave)

载入RDB文件服务器处于阻塞状态

自动间隔保存:可以设置服务器的save选项,让服务器每隔一段时间自动执行bgsave命令。RedisServer的saveparams属性保存了save设置的保存条件,还有dirty计数器记录了上一次成功执行save或bgsave命令后对数据库修改的次数,lastsave记录了上一次成功执行save或bgsave命令的unix时间戳

Save 900 1 表示900秒内至少对数据库进行一次修改

周期性操作函数serverCron默认每隔100ms执行一次,它的其中一项工作就是检查save选项中的保存条件是否满足,如果满足就执行bgsave命令

RDB文件结构

Redis表示为rdb文件,db_version时版本号,databases表示所有非空数据库,EOF表示rdb文件正文结束,check_sum为校验和

Pairs保存该数据库所有的键值对,包括过期时间

不同类型的键值对,以不同的方式保存在rdb文件中

分析rdb文件:同时以ascii和十六进制打印rdb文件

AOF

Aof通过保存resdis所执行的写命令来记录数据库状态

Aof文件中所有的命令都以redis命令请求协议的格式保存

Aof持久化功能的实现可分为命令追加(append),文件写入,文件同步(sync)三步

开启aof后写命令会追加到aof_buf缓冲区末尾

服务器进程就是一个事件循环,结束一个事件循环前会考虑是否将aof_buf缓冲区的内容放到aof文件中

Appendfsync选项默认为everysec

写入与同步:数据写入文件时,通常会先写入内存缓冲区中,缓存满了或者超过时限后,才会将缓冲区的数据写入磁盘

Redis会创建一个伪客户端进行aof文件的载入,服务器读取并执行aof中的写命令恢复数据库的状态

重写

通过读取数据库状态来重写aof文件可以减少文件体积

重写:子进程创建新的aof文件,读取当前数据库状态生成写命令写入aof文件,服务器会在重写时将新的写命令追加到aof缓冲区和aof重写缓冲区。重写完成后会将aof重写缓冲区的内容写入新aof文件中,然后将新aof文件改名,原子地替换新,旧aof文件。

redis默认采用RDB持久化

AOF文件更新比RDB快,AOF持久化功能开启时优先使用AOF文件还原数据库状态

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

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

相关文章

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 含泪播种的人一定能含笑收获&#xff…

【MySQL】MySQL表的约束-空属性/默认值/列属性/zerofill/主键/自增长/唯一键/外键

文章目录 表的约束1.空属性 --null && not null2.默认值 -- default3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 表的约束 表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是…

桶排序(Java语言)

视频讲解地址:【手把手带你写十大排序】8.桶排序(Java语言)_哔哩哔哩_bilibili 代码: public class BucketSort {public void sortFunction(int[] array, int bucketNum) {int max Integer.MIN_VALUE, min Integer.MAX_VALUE;…

【QT】多层QTreeWidget与QStackedWidget的关联操作

通过点击多层QTreeWidget来控制QStackedWidget中的page页面切换 treeWidget设计 treeWidget设计&#xff1a; // treeWidget设计ui->treeWidget->clear();ui->treeWidget->setColumnCount(1);//第一层QStringList l;l<<"管理系统";QTreeWid…

JavaWeb-HTTP

一、概念 HTTP&#xff1a;HyperText Transfer Protocol&#xff0c;超文本传输协议。读者应该不是第一次接触这个名词&#xff0c;但可能仍然不是很理解&#xff0c;笔者将逐一解释。 HyperText&#xff08;超文本&#xff09;&#xff1a;根据维基百科&#xff0c;Hypertex…

Linux数据处理的几个命令

文章目录 Linux数据处理的几个命令文件内容搜索利器 - grep语法默认无参数增加文件夹反向查找不区分大小写显示行数&#xff0c;精准定位 没有规矩不成方圆 sort语法默认无参数根据第N列排序检查是否已经排序逆序排列 你是唯一的 uniq语法默认无参数统计出现频次仅仅显示重复的…

Go语言的调度器

简介 Go语言的调度器是一个非常强大的工具&#xff0c;它可以帮助我们轻松地实现并发编程。调度器的工作原理是将多个协程映射到多个操作系统线程上&#xff0c;并根据协程的状态来决定哪个协程应该在哪个线程上运行。 调度器有两种主要策略&#xff1a; 协作式调度&#xf…

入门Linux简单操作

基本命令 scp ✓ scp -r 文件 127.0.0.1&#xff1a;/root/文件 (source->>>>destination) mv cp ✓ cp xxxx ./xxxx date ✓ 修改时间 date -s “yyyy-MM-dd 12:12:59” find ✓ find /home/user -name “*.txt” grep ✓ 管道 软连接 多用户 免密设置 脚…

iPhone“查找”最多可添加32个物品!

对于那些丢三落四的果粉来说&#xff0c;苹果的“查找”功能是一大福音。不管是丢失了iPhone、iPad、Mac、AirPods还是AirTag&#xff0c;都可以通过“查找”功能在地图上追踪设备的位置&#xff0c;甚至是远程锁定或抹掉设备的数据。 那么&#xff0c;iPhone的查找一次能支持添…

LeetCode 38 外观数列

题目描述 外观数列 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1…

软件测试|解决Github port 443 : Timed out连接超时的问题

前言 GitHub是全球最大的开源代码托管平台之一&#xff0c;许多开发者和团队使用它来管理和协作开源项目。但在当下&#xff0c;我们在clone或者提交代码时会经常遇到"GitHub Port 443: Timed Out"错误&#xff0c;这意味着我们的电脑无法建立与GitHub服务器的安全连…

学习python仅此一篇就够了(函数进阶:lambda函数)

函数进阶 函数的多返回值 def ceshi1():return 1, 2x, y ceshi1() print(x) #1 print(y) #2 函数的多种传参方式 1.位置参数&#xff1a;调用函数时根据函数定义的参数位置来传递参数 def ceshi1(name,age):print(f"你的姓名是{name},你的年龄是{age}")ceshi1(…

xtu oj 1522 格子

题目描述 一个nm的网格&#xff0c;格子里最多能放一枚棋子&#xff0c;将k枚棋子随机放入不同的网格中&#xff0c;使得同行同列最多只有一枚棋子&#xff0c;请问概率是多少&#xff1f; 输入格式 第一行是一个整数T (1≤T≤512)&#xff0c;表示样例的个数。 以后每行一…

UniRepLKNet实战:使用UniRepLKNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要 大核卷积神经网络&#xff08;ConvNets&#xff09;近年来受到广泛关注&#xff0c;但仍存在两个关键问题需要进一步研究。首先&#xff0c;目前的大型卷积神经网络架构大…

设计模式之避免共享的设计模式Copy-on-Write模式

系列文章目录 设计模式之避免共享的设计模式Immutability&#xff08;不变性&#xff09;模式 设计模式之并发特定场景下的设计模式 Two-phase Termination&#xff08;两阶段终止&#xff09;模式 文章目录 系列文章目录一、Copy-on-Write是什么&#xff1f;二、应用 一、Cop…

士兵队列 +队列queue+模拟

士兵队列 队列queue 某部队进行新兵队列训练&#xff0c;将新兵从一开始按顺序依次编号&#xff0c;并排成一行横队&#xff0c;训练的规则如下&#xff1a;从头开始一至二报数&#xff0c;凡报到二的出列&#xff0c;剩下的向小序号方向靠拢&#xff0c;再从头开始进行一至三…

javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图

1、java代码抽取视频缩略图 直接上代码 首先pom 引入了javacv和Thumbnails <!-- 引入javacv --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.6</version></dependency>…

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

Android Lint的使用

代码检查方式一&#xff1a; Android Studio使用Lint进行代码检查 找到Analyze目录下的Inspect Code检查代码选项点击然后弹出下面这个框框&#xff0c;在这个列表选项中我们可以选择Inspect Code的范围&#xff0c;点击OK 待分析完毕后&#xff0c;我们可以在Inspection栏目中…

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑&#xff1f;是否希望有一个简单而强大的工具来满足你的需求&#xff1f;如果是这样&#xff0c;那么 Pinokio 将会是你的理想选择&#xff01;Pinokio 是一款革命性的人工智能浏览器&#xff0c;是一个开…