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.外键 表的约束 表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是…

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

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

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服务器的安全连…

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

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

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;是一个开…

Nocalhost 为 KubeSphere 提供更强大的云原生开发环境

1 应用商店安装 Nocalhost Server 已集成在 KubeSphere 应用商店&#xff0c;直接访问&#xff1a; 设置应用「名称」&#xff0c;确认应用「版本」和部署「位置」&#xff0c;点击「下一步」&#xff1a; 在「应用设置」标签页&#xff0c;可手动编辑清单文件或直接点击「安装…

HCIP-1

一、网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 – 在一个MA网络中同时存在广播&#xff08;洪泛&#xff09;机制 NBMA&#xff1a;非广播型多路访问—在一个MA网络中&#xff0c;没有洪泛机制 MA&#xff1a;多路访问 在一个网段内&#xff0c;存在的节…

大模型实战营Day4 XTuner 大模型单卡低成本微调实战

本次讲师是一位从事算法工作的优秀贡献者。 一起来看看吧&#xff01; 本次课程内容主要有&#xff1a; 我将在此整理前三节的内容&#xff0c;第四节放在作业章节进行讲解&#xff1a; 同第三节的建立数据库中所提及到的&#xff0c;如果通用大模型在专用领域表现能力不强&…

普通两样本孟德尔随机化仍能发一区! | 孟德尔随机化周报(1.03-1.09)

欢迎报名2024年孟德尔随机化方法高级班课程&#xff01; 郑老师团队开设的孟德尔随机化高级班2024年1月20-21日开课&#xff0c;欢迎报名 孟德尔随机化,Mendilian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利…

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

分享一个好用的免费在线扣图网址

具体效果 附地址 https://cutout.aiwave.cc/

dpdk20.11.9 编译arm版本以及在arm 应用中引用dpdk20.11.9

以往19版本的dpdk 都是可以直接用make 的方式进行编译, e.g, make Tx86_64-native-linux-gcc install 为了和客户那边用的DPDK 版本一致, 这次要用dpdk20.11.9, 并且要把之前跑在X86 版本的服务器上的程序跑在ARM 版本上. 目前有两个问题: 1. 编译出arm 版本的dpdk. 2. 把…

程序员副业之AI文库项目(超详细完整全流程)

引言 大家好&#xff0c;我是小黑&#xff0c;今天给大家介绍一个特别简单的项目&#xff0c;用AI辅助咱们来编写各种word&#xff0c;PPT等资料上传到百度文库、原创力、道客巴巴、csdn等平台赚取被动的睡后收益。 但要注意&#xff0c;只是辅助&#xff0c;即便是用AI辅助&…

Flink窗口(2)—— Window API

目录 窗口分配器 时间窗口 计数窗口 全局窗口 窗口函数 增量聚合函数 全窗口函数&#xff08;full window functions&#xff09; 增量聚合和全窗口函数的结合使用 Window API 主要由两部分构成&#xff1a;窗口分配器&#xff08;Window Assigners&#xff09;和窗口函…

wpf使用Popup封装数据筛选框--粉丝专栏

类似于DevExpress控件的功能 这是DevExpress的winform筛选样式&#xff0c;如下&#xff1a; 这是DevExpress的wpf筛选样式&#xff0c;如下&#xff1a; 这是Excel的筛选样式&#xff0c;如下&#xff1a; 先看效果 本案例使用wpf原生控件封装&#xff0c;功能基本上都满足…