Redis学习总结(二)

news2024/11/25 4:40:32

AOF 为什么是在执行完命令之后记录日志?

关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。AOF 记录日志过程为什么是在执行完命令之后记录日志呢?

  1. 避免额外的检查开销,AOF 记录日志不会对命令进行语法检查;

  2. 在命令执行完之后再记录,不会阻塞当前的命令执行。

这样也带来了风险(我在前面介绍 AOF 持久化的时候也提到过):

  1. 如果刚执行完命令 Redis 就宕机会导致对应的修改丢失;

  2. 可能会阻塞后续其他命令的执行(AOF 记录日志是在 Redis 主线程中进行的)。

AOF 重写

当 AOF 变得太大时,Redis 能够在后台自动重写 AOF 产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。

在这里插入图片描述

AOF 重写(rewrite) 是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有 AOF 文件进行任何读入、分析或者写入操作。

由于 AOF 重写会进行大量的写入操作,为了避免对 Redis 正常处理命令请求造成影响,Redis 将 AOF 重写程序放到子进程里执行。

AOF 文件重写期间,Redis 还会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。

开启 AOF 重写功能,可以调用 BGREWRITEAOF 命令手动执行,也可以设置下面两个配置项,让程序自动决定触发时机:

  1. auto-aof-rewrite-min-size:如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB;

  2. auto-aof-rewrite-percentage:执行 AOF 重写时,当前 AOF 大小(aof_current_size)和上一次重写时 AOF 大小(aof_base_size)的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100。

文件重写(AOF Rewrite)是Redis AOF持久化机制的一种功能,它能够对AOF文件中的历史写命令进行压缩和整理,以便减少文件的大小,并提高访问性能。

当Redis服务器在运行一段时间后,AOF文件会不断增大,导致对磁盘空间的占用和访问性能的下降。为了减少AOF文件的大小和提高访问性能,Redis引入了文件重写功能。AOF Rewrite功能会扫描整个数据库,将执行过的写命令重写到新的AOF文件中,并以一种紧凑且可读性强的格式保存。在重写完成后,新文件将替换旧文件,成为新的AOF文件。

AOF Rewrite功能的执行过程包括以下几个步骤:

  1. 创建新的AOF文件,开始进行重写操作。

  2. Redis使用服务器进程的内部数据结构来重现所有的写操作,将操作逐个写入到新的AOF文件中。

  3. Redis使用一个临时缓冲区来保存重写过程中的写操作,避免重写过程中Redis无法响应客户端请求的现象。

  4. 当Redis重写完所有的写操作之后,它会将新的AOF文件重命名为旧的AOF文件的名字,并将临时缓冲区中的写操作集成到新的AOF文件中。

  5. 最后,Redis会将旧的AOF文件删除,释放与之关联的磁盘空间。

需要注意的是,AOF Rewrite操作需要消耗大量的处理器和磁盘资源,因此在执行重写操作时,需要权衡磁盘空间占用和访问性能之间的关系,选择适当的重写时间间隔。

Redis 4.0 对于持久化机制做了什么优化?

由于 RDB 和 AOF 各有优势,于是,Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。

如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不再是 AOF 格式,可读性较差。

如何选择 RDB 和 AOF?

RDB 比 AOF 优秀的地方

RDB 文件存储的内容是经过压缩的二进制数据, 保存着某个时间点的数据集,文件很小,适合做数据的备份,灾难恢复。AOF 文件存储的是每一次写命令,类似于 MySQL 的 binlog 日志,通常会比 RDB 文件大很多。当 AOF 变得太大时,Redis 能够在后台自动重写 AOF。新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。不过, Redis 7.0 版本之前,如果在重写期间有写入命令,AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。

使用 RDB 文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而 AOF 则需要依次执行每个写命令,速度非常慢。也就是说,与 AOF 相比,恢复大数据集的时候,RDB 速度更快。

AOF 比 RDB 优秀的地方

RDB 的数据安全性不如 AOF,没有办法实时或者秒级持久化数据。生成 RDB 文件的过程是比较繁重的, 虽然 BGSAVE 子进程写入 RDB 文件的工作不会阻塞主线程,但会对机器的 CPU 资源和内存资源产生影响,严重的情况下甚至会直接把 Redis 服务干宕机。AOF 支持秒级数据丢失(取决 fsync 策略,如果是 everysec,最多丢失 1 秒的数据),仅仅是追加命令到 AOF 文件,操作轻量。

RDB 文件是以特定的二进制格式保存的,并且在 Redis 版本演进中有多个版本的 RDB,所以存在老版本的 Redis 服务不兼容新版本的 RDB 格式的问题。

AOF 以一种易于理解和解析的格式包含所有操作的日志。你可以轻松地导出 AOF 文件进行分析,你也可以直接操作 AOF 文件来解决一些问题。比如,如果执行FLUSHALL命令意外地刷新了所有内容后,只要 AOF 文件没有被重写,删除最新命令并重启即可恢复之前的状态。

综上

Redis 保存的数据丢失一些也没什么影响的话,可以选择使用 RDB。

不建议单独使用 AOF,因为时不时地创建一个 RDB 快照可以进行数据库备份、更快的重启以及解决 AOF 引擎错误。

如果保存的数据要求安全性比较高的话,建议同时开启 RDB 和 AOF 持久化或者开启 RDB 和 AOF 混合持久化。

Redis 过期字典

Redis 过期字典是 Redis 中用于实现 Key 的过期时间的一种数据结构。当一个 Key 设置了过期时间后,在到达过期时间时,Redis 会自动将这个 Key 删除,以释放空间。

在 Redis 中,当 Key 设置了过期时间时,Redis 会将这个 Key 和它的过期时间插入到过期字典中。过期字典是以跳跃表(Skip List)为基础实现的,每个节点包含了 Key 和它的过期时间。

Redis 每秒钟会对过期字典进行检查,以删除已经过期的 Key。检查时,Redis 会对跳跃表中的每个节点,检查它的过期时间是否已经过期,如果已经过期,则执行删除操作,并将 Key 从过期字典中删除。

过期字典的主要作用是自动删除过期 Key,以释放空间。这对于缓存系统非常有用,因为缓存数据通常是有限期的,一旦过期就需要删除它们。进行手动删除显然不可行,因此过期字典的自动删除机制非常有用。

以下是过期字典的核心结构体:

typedef struct redisDb {
    // ...
    dict *dict;                         // 字典,保存着数据库中的所有键值对
    dict *expires;                      // 过期字典,保存着键的过期时间
    // ...
} redisDb;

其中,dict 变量保存数据库的所有键值对,expires 变量保存键的过期时间,它们都是 dict 类型(哈希表),expires 变量是一个特殊的哈希表类型。

以下是 Redis 中设置 Key 过期时间的命令:

// 设置 key 10 秒后过期
$> SET key value EX 10

// 设置 key 在指定时间戳过期
$> SET key value EXAT 1609459200

以下是 Redis 过期字典的代码示例:

// 设置 key 并设置过期时间为 10 秒
$> SET key value EX 10

// 获取 key 的过期时间
$> TTL key

// 返回 key 是否存在和是否带有过期时间(-1 表示 key 不存在,-2 表示 key 存在但没有设置过期时间)
$> EXISTS key

除了在键过期时自动删除键以外,Redis 的过期键检查还具有一些其他的功能。例如,过期字典还可以提供网络普通键(network ordinary key)的拓展能力,使得这些键不会因为过期而被删除。网络普通键是具有周期性的过期时间的键,它的过期时间不是固定的,而是会根据具体应用场景进行动态调整。网络普通键的过期时间需要由逻辑执行程序(比如定时器)来动态维护。

Redis 过期字典的实现是基于字典结构和跳跃表结构,这样的实现方法可以保证 Redis 的高性能。因为跳跃表具有较好的查找、插入和删除性能,而且 Redis 跳跃表是基于链表实现的,具有空间效率优势。

总结来说,Redis 过期字典是 Redis 实现键的过期时间的一种数据结构。通过使用过期字典,可以实现自动删除过期键的功能。过期字典的实现基于字典结构和跳跃表结构,具有高性能和较好的空间效率。在实际应用中,可以利用过期字典实现缓存系统和网络普通键等应用场景。

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

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

相关文章

如何让GPT不再胡说八道

相信我们大部分人在使用GPT的时候,会发现GPT经常在胡言乱语、回复错误的答案等情况,甚至有的内容牛头不对马嘴,直接开始编造,例如下面案例: 我: 周树人是谁 GPT:周树人 (1897年-1975年) &…

独立开发变现周刊(第90期):自学开发了一个36万美元/年的ChatGPT应用

分享独立开发、产品变现相关内容,每周五发布。 目录 1、ChatGPT-Midjourney: 开源 ChatGPTMidjourney 网页应用2、PLExtension: 一个图床上传浏览器扩展3、EasySpider: 一个可视化爬虫软件4、BibiGPT: 音视频 AI 一键总结 & 对话5、自学的程序员开发了一个36万美…

【i阿极送书——第四期】《ChatGPT时代:ChatGPT全能应用一本通》

系列文章目录 作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒…

MongoDB集群和安全

目录 副本集-Replica Sets简介副本集的三个角色副本集架构目标副本集的创建主节点副本节点仲裁节点初始化配置副本集和主节点查看副本集的配置内容查看副本集状态添加副本从节点添加仲裁从节点副本集的数据读写操作 主节点的选举原则完整的连接字符串 分片集群-Sharded Cluster…

spring杂记

1、springboot是如何解析yml配置文件中的 tomcat配置,并将其赋值给 tomcat的 重要类 ServerProperties。该类为解析yml文件中的server配置 下面我们主要看看是怎样将 端口号 port 赋值给tomcat的 找到port属性,点击getter方法 发现调用该方法的地方为 …

在弹出框内三个元素做水平显示

最终效果图要求是这样: js代码: // 显示弹出窗口 function showPopup(node) {var popup document.createElement(div);popup.className popup;var inputContainer1 document.createElement(div);/* inputContainer1.className input-container1; */…

Upscayl:开源AI图像放大增强工具 | AIGC实践

连续写了两篇比较理论的文章——一篇行业思考,一篇技术讨论——可能劝退了很多不明真相的人民群众,一看后台数据,好么…… 马上周末了,今天分享一篇轻松小文,介绍一款开源免费、成熟度高、操作简单、效果显著的开源AI图…

记录--开始使用Vue 3时应避免的10个错误

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Vue 3 稳定已经有一段时间了。许多代码库正在生产中使用它,其他人最终也必须进行迁移。我有机会与它一起工作,并记录了我的错误,这可能是你想避免的。 1.使用响应式…

.Net8罕见的技术:MSIL的机器码简析

前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机里面万物都是二进制,本篇来看下,以下…

【GitHub探索】用python写web前端之reactpy探索

你有想象过用python来写web前端这种操作么?近期在github-trending上就有这样的一个项目reactpy,可以满足你在python上写web前端的欲望。为此,笔者也决定踩踩坑,看看这个项目的形式到底如何,能不能很方便地实际投产。 …

对比 document.URL 和 location.href

对比 document.URL 和 location.href document.URL 和 location.href 的不同点 document.URL只读 , location.href读写 给 document.URL 赋值, document.URL的值不会改变 给 location.href 赋值, location.href 的值改变了, 并且页面也改变了, 效果和 location.assign()一样…

解数独--难的一批

1题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数…

【MySQL】数据库SQL语句之DML

目录 前言: 一.DML添加数据 1.1给指定字段添加数据 1.2给全部字段添加数据 1.3批量添加数据 二.DML修改数据 三.DML删除数据 四.结尾 前言: 时隔一周,啊苏今天来更新啦,简单说说这周在做些什么吧,上课、看书、…

ubuntu编译安装pcl

环境配置: ubuntu18.04pcl1.11.0 下载源码并解压 tar -zxvf pcl-pcl-1.11.0.tar.gz 进入解压后的文件夹、建立bulid文件夹并进入该文件夹 安装依赖 sudo apt-get update 使用apt-get包管理器安装CMake: sudo apt-get install cmake 使用apt-get包管理…

创新案例 | 新锐品牌Usmile如何借助社媒运营打造爆品成为国产电动牙刷TOP1?

Usmile 是广州星际悦动股份有限公司旗下全面口腔护理品牌。2016 年至今,Usmile共荣获了 16 项国内外设计大奖,2020 年“双十一”期间,入选 2020 年度天猫十大新品牌,销售额超 1 亿,成为国内首个破亿的电动牙刷品牌&…

【立体视觉(一)】之成像原理与相机畸变

【立体视觉(一)】之成像原理与相机畸变 一、成像原理一)针孔模型二)坐标系转换1. 世界坐标系到相机坐标系2. 相机坐标系到图像坐标系3. 图像坐标系到像素坐标系4. 相机坐标系到像素坐标系5. 世界坐标系到像素坐标系 二、相机畸变一…

618数码节该如何挑选,推荐几款618值得入手的数码好物

又到了一年一度的618剁手季,各大电商平台都纷纷推出了超级大促活动,激发了无数值友的狂热购物欲望。你是否也已经开始摩拳擦掌,准备掏钱包买买买呢?那么赶快听听小编的建议吧!经过自己使用的亲身体验,小编给…

Superset | 地图无法显示的问题

知识目录 一、写在前面二、Superset地图显示不了三、Superset无法加载已更新的MySQL数据库数据 一、写在前面 大家好!我是初心,一直在寻找并尝试着适合自己的方向! Apache Superset是一款由Python语言为主开发的开源时髦数据探索分析以及可…

高通 Camera HAL3:集成camxoverridesettings.txt到整机版本

camxoverridesettings.txt 是高通提供给开发者临时进行CAMX、CHI-CDK功能调试的一种方式,通过配置各种变量值然后写入到该文件,能控制Log打印、参数配置、数据dump等多种功能 这个文件需要集成在设备目录的vendor/etc/camera/里 因为camxoverridesetti…

2023年金九银十最新 Java面试必背八股文(含答案)详解

马上又逢金九银十,意味着很多人又面临着就职和跳槽,相信还有很多人对于自己就职没有很大的把我,今天就给大家分享我一个朋友总结的Java必问核心知识点,以及面试真题解答。 Java 面试 现在 Java 面试都是靠八股文,所以…