【Redis】持久化-RDBAOF混合持久化

文章目录

  • 前置知识
  • RDB(定期备份)
    • 触发机制
    • 流程说明
    • RDB文件的处理
    • RDB 的优缺点
  • AOF(实时备份)
    • 使用AOF
    • 命令写入
    • AOF工作流程
    • 文件同步
    • 重写机制
      • 重写触发机制
      • AOF进制重写流程
  • 混合持久化
    • 启动时数据恢复
  • 总结

前置知识

回顾MySQL

MySQL的事务有4个比较核心的特性:

  • 原子性 一致性 持久性 隔离性

何为持久

重启进程/重启主机之后数据是否仍然存在 => 把数据存储到硬盘上:持久,如果把数据存储到内存上 :不持久


redis是一个内存数据库,将数据存储到内存当中,但是内存当中的数据是不持久的,如果想做到持久,那么就需要让redis把数据存储到硬盘上。Redis相比于MySQL这样的关系型数据库,最明显的特点/优势:效率高,快

为了保证速度快,数据肯定还得在内存当中,但是为了持久,数据还得想办法存储在硬盘上,这样的两份数据,理论上是完全相同的。Redis⽀持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题,当下次重启时利⽤之前持久化的⽂件即可实现数据恢复


RDB(定期备份)

RDB持久化是定期把当前redis内存当中的数据⽣成快照保存到硬盘的过程,触发RDB持久化过程分为⼿动触发和⾃动触发

触发机制

⼿动触发:程序员通过redis客户端执行特定的命令,来触发快照生成,对应save和bgsave命令:

  • save命令:阻塞当前Redis服务器,直到RDB过程完成为⽌,对于内存⽐较⼤的实例,会造成⻓时间阻塞,基本不采⽤
  • bgsave 命令:Redis 进程执⾏ fork 操作创建⼦进程,RDB 持久化过程由⼦进程负责,完成后⾃动结束。阻塞只发⽣在 fork 阶段,⼀般时间很短,不会影响redis服务器处理其它客户端的请求和命令

Redis 内部的所有涉及 RDB 的操作都采⽤类似 bgsave 的⽅式


何时会自动触发

1.使⽤ save 配置。如 “save m n” 表⽰ m 秒内数据集发⽣了 n 次修改,⾃动 RDB 持久化

  • 在redis配置文件当中进行设置,让redis每隔多长时间/每产生多少次修改就触发

image-20231029151639776

虽然此处的数值可以自由修改配置,但是因为生成一次rdb快照是有成本的,所i有不能让这个操作执行的太频繁,所以可能就会导致快照里面的数据和当前实时的数据情况可能存在偏差

2.redis进行主从复制的时候,从节点进⾏全量复制操作时,主节点会进行RDB 持久化(生成rdb快照),随后将rdb快照文件内容发送给从结点

3.执⾏ shutdown 命令关闭 Redis 时 / 正常关闭redis服务器

,也会执⾏ RDB 持久化


如果插入新的key,不手动执行bgsave,然后重启redis服务器会怎么样

1.如果是正常流程重启redis服务器,此时redis服务器会在退出的时候,自动触发生成rdb持久化操作

2.如果是异常重启(kill -9 或者服务器掉电),此时redis服务器来不及进行rdb持久化操作,那么此时内存当中尚未保存到快照中的数据就会随着重启而丢失


流程说明

bgsave 命令的运作流程

image-20231022112832960

1.执⾏ bgsave 命令,Redis ⽗进程判断当前进是否存在其他正在执⾏的⼦进程,如 RDB/AOF ⼦进 程,如果存在 bgsave 命令直接返回

2.⽗进程执⾏ fork 创建⼦进程,fork 过程中⽗进程会阻塞,通过 info stats 命令查看 latest_fork_usec 选项,可以获取最近⼀次 fork 操作的耗时,单位为微秒

3.⽗进程 fork 完成后,bgsave 命令返回 “Background saving started” 信息并不再阻塞⽗进程,可 以继续响应其他命令

4.⼦进程创建 RDB ⽂件,根据⽗进程内存⽣成临时快照⽂件,完成后对原有⽂件进⾏原⼦替换。执 ⾏ lastsave 命令可以获取最后⼀次⽣成 RDB 的时间,对应 info 统计的 rdb_last_save_time 选 项

5.进程发送信号给⽗进程表⽰完成,⽗进程更新统计信息


RDB文件的处理

保存:RDB ⽂件保存在配置文件/etc/redis/redis.conf指定的⽬录:

image-20231029145450517

⽂件名通过 dbfilename 配置(默认 dump.rdb)指定

  • 这个是rdb机制生成的镜像文件,它是二进制文件,将内存当中的数据以压缩的形式保存当这个二进制文件当中,压缩需要消耗一定的CPU在资源,但是能节省存储空间
  • 后续redis服务器重新启动就会尝试加载这个rdb文件,如果发现格式错误,就可能导致加载数据失败
  • 注意:rdb文件虽然不主动修改它,仍然可能会出现意外问题,比如网络传输或者其它问题可能会引起这个文件的损坏,此时redis服务器就无法启动

image-20231029145516525

可以通过执⾏config set dir {newDir}config set dbfilename {newFilename} 运⾏期间动态执⾏,当下次运⾏时 RDB ⽂件会保存到新⽬录


**压缩:**Redis 默认采⽤ LZF 算法对⽣成的 RDB ⽂件做压缩处理,压缩后的⽂件远远⼩于内存⼤ ⼩,默认开启,可以通过参数 config set rdbcompression {yes|no} 动态修改

虽然压缩 RDB 会消耗 CPU,但可以⼤幅降低⽂件的体积,⽅便保存到硬盘或通过⽹络发送到 从节点,因此建议开启


注意1:rdb持久化操作可以进行多次,当执行生成rdb镜像文件操作的时候,此时就会把要生成的快照数据先保存到一个临时文件当中,当这个快照生成完成之后,在删除之前的rdb文件,然后把新生成的rdb文件的名字改成刚才的dump.rdb 。但是rdb文件始终是只有一个的!!!

验证:可以通过Linux的stat命令查看文件的相关信息,观察文件inode编号的变化

image-20231029154752726

注意2:执行flushall操作会清空rdb文件


如果把rdb文件故意改坏了,此时会怎么样

手动的把rdb文件内容改坏,然后一定是通过kill掉redis进程的方式,然后重新启动redis服务器,如果是通过service redis-server restart重启,就会在redis服务器退出的时候重新生成rdb快照,就会把刚才改坏的rdb文件重新替换为正确的。

rdb文件坏了,得到的结果是不可预期的,如果 Redis 启动时加载到损坏的 RDB ⽂件会拒绝启动。这时可以使⽤ Redis 提供的 redis-check-dump ⼯具检测 RDB ⽂件并获取对应的错误报告

image-20231029160109789

当redis服务器挂了的时候,可以看看redis日志了解发生了什么:/var/log/redis/

image-20231029160508541


RDB 的优缺点

1)RDB 是⼀个压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全 量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中 (如 hdfs)⽤于灾备

2)Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式。

  • 因为RDB使用的是二进制的方式来组织数据,直接把数据读取到内存当中,然后按照字节的个数读取出来放到结构体/对象当中,而AOF是用文本的方式组织数据,需要进行一系列的字符串切分操作

3)RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进 程,属于重量级操作,频繁执⾏成本过⾼

4)RDB ⽂件使⽤特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛ 险

  • 老版本的redis的rbd文件,放到新版本的redis当中不一定能识别到,如果确实要又一些升级版本的需要,就可以通过程序,直接遍历旧的redis当中的所有key,将数据取出来,插入到新的redis服务器当中

RDB最大的问题,就是不能实时的持久化保存数据,在两次生成快照之间,实时的数据可能会随着重启而丢失

例如:配置文件当中save 60 10000代表的含义就是:两次生成rdb之间的间隔,最少是60s,并且需要执行10000次操作以上才会触发。

  • 假设12:00:00生成了rdb文件(此时硬盘的那个字的快照数据和内存当中的一样),从12:00:01开始,redis收到了大量的key的变化请求,此时会在12:01:00生成下一个快照文件
  • 但是如果在12:00:01 ~ 12:01:00之间redis服务器挂了,那么就会导致12:00:00之后的数据丢失了,此时就需要使用AOF持久化方式来解决上述的问题

如果需要关闭自动生成快照,只需要在配置文件当中改为:save ""


AOF(实时备份)

AOF(Append Only File)持久化:以独⽴⽇志的⽅式记录每次写命令(把用户的每个操作都记录到文件当中),redis重启时,再重新执⾏ AOF ⽂件中的命令达到恢复数据的⽬的。AOF 的主要作⽤是解决了数据持久化的实时性,⽬前已经是 Redis 持久化的主流⽅式

使用AOF

开启 AOF 功能需要设置配置:appendonly yes,默认不开启

image-20231029162536826

如果开启了aof功能,那么rdb功能就不生效了,启动的时候不再去读取rdb文件的内容

AOF ⽂件名通过 appendfilename 配置(默认是 appendonly.aof)设置。保存⽬录同 RDB 持久化⽅式⼀致,通过 dir 配置指定

image-20231029162603171

AOF 的⼯作流程操作:命令写⼊(append)、⽂件同步(sync)、⽂件重写 (rewrite)、重启加载(load),AOF是一个文本文件每次进行的操作都会记录到文本文件当中,通过一些特殊符号为分隔符,来对命令的细节作出区分

image-20231029162756070


命令写入

AOF 命令写⼊的内容直接是⽂本协议格式。例如 set hello world 这条命令,在 AOF 缓冲区会追加如下 ⽂本:

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

此处遵守 Redis 格式协议,Redis 选择⽂本协议可能的原因:⽂本协议具备较好的兼容性;实现简单; 具备可读性


AOF工作流程

image-20231022113246897

1.所有的写⼊命令会追加到 aof_buf(缓冲区)中

2.AOF 缓冲区根据对应的策略向硬盘做同步操作

3.随着 AOF ⽂件越来越⼤,需要定期对 AOF ⽂件进⾏重写,达到压缩的⽬的

4.当 Redis 服务器启动时,可以加载 AOF ⽂件进⾏数据恢复


问:引入了AOF之后,redis既要学内存又要写硬盘,速度还能和之前一样快吗

实际上AOF机制并没有影响到redis处理请求的速度

1)因为AOF机制并非是直接让工作线程把数据写入硬盘,而是先写入一个内存当中的缓冲区,积累一部分内容之后再统一写入硬盘,就能大大降低写硬盘的次数。 写硬盘的时候,写入硬盘数据的多少对于性能影响没有多大,但是写入硬盘的次数则影响很大

2)硬盘上读写数据,顺序读写的速度是比较快的(但是还是比内存要慢),但是在硬盘上随机访问的速度是比较慢的,而AOF是每次把新的操作写入到原有文件的末尾,属于是顺序写入

注意:因为是先把数据写入到缓冲区当中,本质上还是在内存当中,如果这个时候进程挂了或者主机掉电了,此时缓冲区当中没有来得及写入硬盘的数据是会丢失的!

redis给出了一些选项,根据实际情况来决定取舍,也就是缓冲区的刷新策略

  • 刷新频率越高,性能影响越大,同步数据的可靠性越高
  • 刷新频率越低,性能影响越小,同步数据的可靠性越低

文件同步

Redis 提供了多种 AOF 缓冲区同步⽂件策略,由参数 appendfsync 控制

image-20231029172443322

可配置项说明说明
always命令写⼊ aof_buf 后调⽤ fsync 同步,完成后返回频率最高,数据可靠性最高,性能最低
everysec命令写⼊aof_buf 后只执⾏ write 操作,不进行fsync,每秒由同步线程进行fsync频率低一些,数据可靠性降低,性能提高
no命令写⼊ aof_buf 后只执⾏ write 操作,由OS控制fsync频率频率最低,数据可靠性最低,性能最高

系统调⽤ write fsync 说明:

1.write 操作会触发延迟写(delayed write)机制。Linux 在内核提供⻚缓冲区⽤来提供硬盘 IO 性 能。write 操作在写⼊系统缓冲区后⽴即返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区 ⻚空间写满或达到特定时间周期。同步⽂件之前,如果此时系统故障宕机,缓冲区内数据将丢失

2.Fsync 针对单个⽂件操作,做强制硬盘同步,fsync 将阻塞直到数据写⼊到硬盘

3.配置为 always 时,每次写⼊都要同步 AOF ⽂件,性能很差,在⼀般的 SATA 硬盘上,只能⽀持⼤ 约⼏百 TPS 写⼊。除⾮是⾮常重要的数据,否则不建议配置

4.配置为 no 时,由于操作系统同步策略不可控,虽然提⾼了性能,但数据丢失⻛险⼤增,除⾮数据 重要程度很低,⼀般不建议配置

5.配置为 everysec,是默认配置,也是推荐配置,兼顾了数据安全性和性能。理论上最多丢失 1 秒的 数据


重写机制

随着命令不断写⼊ AOF,⽂件会越来越⼤,会影响redis下次启动的时间(因为redis启动要读取aof文件的内容),为了解决这个问题,Redis 引⼊ AOF 重写机制压缩文件体积

AOF ⽂件重写是把 Redis 进程内的数据转化为写命令同步到新的 AOF ⽂件(因为原来的aof文件还记录了中间的过程,然而实际上redis在重新启动的时候,只关注最终结果),较⼩的 AOF ⽂件⼀⽅⾯降低了硬盘空间占⽤,还可以提升启动 Redis 时数据恢复的速度

重写后的 AOF文件为什么可以变⼩?

  • 进程内已超时的数据不再写⼊⽂件
  • 旧的 AOF 中的⽆效命令,例如 delhdelsrem 等重写后将会删除,只需要保留数据的最终版本
  • 多条写操作合并为⼀条,例如 lpush list alpush list blpush list c 从可以合并为 lpush list a b c

image-20231029172952477

剔除冗余操作,合并一些操作,减小aof文件的占用空间


重写触发机制

AOF 重写过程可以⼿动触发和⾃动触发:

  • ⼿动触发:调⽤ bgrewriteaof 命令

  • ⾃动触发:根据 auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage 参数确定⾃动触发时机

    • auto-aof-rewrite-min-size:表⽰触发重写时 AOF 的最⼩⽂件⼤⼩,默认为 64MB
    • auto-aof-rewrite-percentage:代表当前 AOF 占⽤⼤⼩相⽐较上次重写时增加的⽐例

    image-20231029173542011


AOF进制重写流程

image-20231022114101781

1.执⾏ AOF 重写请求

  • 如果当前进程正在执⾏ AOF 重写,请求不执⾏。
  • 如果当前进程正在执⾏ bgsave 操作(生成rdb快照文件),此时aof重写操作就会等待,等待 bgsave 完成之后再执⾏aof重写

2.⽗进程执⾏ fork 创建⼦进程,父进程仍然负责接收请求,子进程负责针对aof文件进行重写

3.重写

  • 主进程 fork 之后,继续响应其他命令。所有新来的修改操作写⼊ AOF 缓冲区并根据 appendfsync 策 略同步到硬盘,再刷新到原来的AOF文件当中,保证旧 AOF ⽂件机制正确,
  • ⼦进程里的内存数据是父进程fork之前的状态,fork之后新来的请求,对内存造成的修改,子进程是不知道的,⽗进程中需要将 fork 之后这段时间的修改操作写⼊ AOF 重写缓冲区(aof_rewrite_buf)中,专门用户存放fork之后收到的数据

4.⼦进程根据内存快照,将命令合并到新的 AOF ⽂件中

  • 注意:重写的时候不关心原来的aof文件,只是关心内存当中最终的数据状态,子进程只需要把内存当中的数据获取出来,以AOF的格式写入到一个新的AOF文件当中(内存当中的数据的状态就相当于是把AOF文件结果整理后的样子)

5.⼦进程完成重写

  • 新⽂件写⼊后,⼦进程发送信号给⽗进程
  • 父进程把 AOF重写缓冲区内临时保存的命令追加到新 AOF ⽂件中
  • ⽤新 AOF ⽂件替换⽼ AOF ⽂件

注意:父进程fork之后,就已经让子进程写新的aof文件了,并且随着时间推移,子进程很快就写完了新的文件,要让新的aof文件代替旧的,但是父进程此时还在继续写这个即将消亡的进的aof文件,此时是否还有意义?

  • 不能不写!要考虑极端情况,假设在重写的过程当中,重写到一半服务器挂了,此时子进程内存的数据就会丢失,新的aof文件内容还不完整,如果父进程不坚持写aof文件,此时重启服务器的时候就没办法保证数据的完整性了

混合持久化

AOF本来是按照文本的方式写入文件的,但是文本的方式写入文件,后续加载的成本比较高,所以redis就引入了混合持久化的方式,结合了rdbaof的特点:

  • 按照aof的方式,每一个请求/操作都记录到文件当中,在触发aof重写之后,就会把当前内存的状态按照rdb的二进制格式写入到新的aof文件当中,后续再进行的操作,仍然是按照aof文本的形式追加到文件的后面

image-20231030095538738

在配置文件当中,这个选项为yes表示开启混合持久

注意:如果当redis上同时存在aof文件和rdb快照的时候,以aof文件为主,此时rdb快照就直接被忽略了!

  • 这是因为AOF中包含的数据比RDB更全

启动时数据恢复

当 Redis 启动时,会根据 RDB 和 AOF ⽂件的内容,进⾏数据恢复

Redis 根据持久化⽂件进⾏数据恢复

image-20231022114306655

总结

1.RDB 视为内存的快照,产⽣的内容更为紧凑,占⽤空间较⼩,恢复时速度更快。但产⽣ RDB 的开 销较⼤,不适合进⾏实时持久化,⼀般⽤于冷备和主从复制

2.AOF 视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩 AOF ⽂件

3.RDB 和 AOF 都使⽤ fork 创建⼦进程,利⽤子进程拥有⽗进程内存快照的特点进⾏持久化, 尽可能不影响主进程继续处理后续命令

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

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

相关文章

upload-labs关卡12(基于白名单的%00截断绕过)通关思路

文章目录 前言一、靶场需要了解的前置知识1、%00截断2、0x00截断3、00截断的使用条件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶场第十二关通关思路1、看源代码2、bp抓包%00截断3、验证文件是否上传成功 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&…

山西电力市场日前价格预测【2023-11-23】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-23)山西电力市场全天平均日前电价为148.77元/MWh。其中,最高日前电价为420.40元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出…

谷歌开发者账号登录提示“存在异常活动”的原因及解决方法

相信很多开发者在登录谷歌开发者账号时遇到过这样的情况:“Verify your identity” “Weve detected unusual activity on the accountyoure trying to access. To continue, please followthe instructions below.” “验证您的身份,我们已经检测到你…

Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

文章目录 数据聚合聚合的种类DSL实现聚合RestAPI实现聚合 自动补全拼音分词器自定义分词器自动补全查询completion suggester查询RestAPI实现自动补全 数据同步数据同步思路分析实现elasticsearch与数据库数据同步 集群搭建ES集群创建es集群集群状态监控创建索引库1&#xff09…

优先经验回放(prioritized experience replay)

prioritized experience replay 思路 优先经验回放出自ICLR 2016的论文《prioritized experience replay》。 prioritized experience replay的作者们认为,按照一定的优先级来对经验回放池中的样本采样,相比于随机均匀的从经验回放池中采样的效率更高&…

matlab绘图函数plot和fplot的区别

一、背景 有的函数用plot画就会报错,显示数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组。 如下图所示: 但用fplot函数就没有问题,因此这里记录一下两者的区别,如果使用不当,画出的图可能就是下…

坚鹏:中国工商银行数字化转型发展现状与成功案例培训圆满结束

中国工商银行围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局,深入推进数字化转型,加快形成体系化、生态化实施路径,促进科技与业务加速融合,以“数字工行”建设推动“GBC”(政务、企业、个人&…

用 jmeter 对 mongodb 进行测试方法合集

MongoDB 作为非关系型数据库,在现在企业中,还是有广泛的使用。但是,用 jmeter 如何测试 MongoDB,却是一个令很多人头疼的问题。去搜索,国内基本找不到一篇比较有价值的文章。 今天,我就用三种不同方法&…

如何通过RA过程识别Redcap UE?

以下是38.300中的描述 RedCap UE可以通过发送MSG3/MSGA的特定LCID识别,可选条件是通过MSGA/MSG1的PRACH occasion/PRACH preamble识别,根据这段描述,通过MSG3/MSGA的识别是必须项,而MSGA/MSG1的识别过程是可选项。如果通过MSGA/MS…

02 请求默认值

一、HTTP请求默认值:是用来管理所有请求共有的协议、网址、端口等信息的;通常情况下,一批量的接口测试,访问的是同一个站点,那么以上信息基本都是相同的,就不需要在每个请求中重复编写; 每个请…

Spring cloud - Hystrix源码

其实只是Hystrix初始化部分,我们从源码的角度分析一下EnableCircuitBreaker以及HystrixCommand注解的初始化过程。 从EnableCircuitBreaker入手 我们是通过在启动类添加EnableCircuitBreaker注解启用Hystrix的,所以,源码解析也要从这个注解…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

ansible的基本安装

目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原装出厂Win11系统ISO镜像

光影精灵9笔记本电脑原厂W11系统22H2恢复出厂时开箱状态一模一样 适用型号:15-fa1003TX,15-fa1005TX,15-fa1007TX,15-fa1025TX 链接:https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取码&#xff1a…

【华为OD题库-033】经典屏保-java

题目 DVD机在视频输出时,为了保护电视显像管,在待机状态会显示"屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹:请根据如下要求,实现屏保Logo坐标的计算算法 1、屏幕是一个800 * 600像素的矩形&…

软件测试:功能测试常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求&#xf…

JavaScript实现右键菜单

1、代码实现 window.onload function () {(function () {// 自定义右键菜单内容并插入到body最后一个节点前let dom <div id"rightMenuBars"><div class"rightMenu-group rightMenu-small"><div class"rightMenu-item"><…

【应用程序启动过程-三种加载控制器的方式-上午内容复习 Objective-C语言】

一、我们先来回忆一下,上午所有内容 1.首先呢,我们先说的是这个“应用程序启动过程”, 应用程序启动过程里面,有三方面内容 1)UIApplication对象介绍 2)AppDelegate对象介绍 3)应用程序启动过程 现在不知道大家对这个应用程序启动过程有印象吗, 2.首先,这个UIAp…

渗透测试高级技巧(一):分析验签与前端加密

“开局一个登录框” 在黑盒的安全测试的工作开始的时候&#xff0c;打开网站一般来说可能仅仅是一个登录框&#xff1b;很多时候这种系统往往都是自研或者一些业务公司专门研发。最基础的情况下&#xff0c;我们会尝试使用 SQL 注入绕过或者爆破之类的常规手段&#xff0c;如果…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、关于Lena图片 7、…