当前位置: 首页 > news >正文

Redis持久化

Redis持久化

  • 一.认识持久化
    • 1.简单介绍
    • 2.持久化策略
  • 二.RDB
    • 1.快照
    • 2."定期"
      • fork
    • 3.RDB演示
      • (1)手动执行save&bgsave触发一次生成快照
      • (2)插入key,不手动执行bgsave
      • (3)执行bgsave后,新旧文件的替换
      • (4)通过配置自动生成rdb快照
      • (5)rdb文件内容被故意删改
      • 4.RDB的优缺点
  • 四.AOF
    • 1.AOF的简介
    • 2.AOF是否影响Redis性能
    • 3.缓冲区刷新策略
    • 4.AOF重写机制
      • (1)重写流程
      • (2)重写流程中的问题
    • 5.混合持久化

一.认识持久化

1.简单介绍

持久化简单的理解就是把数据存在硬盘上,这样数据就不会丢失了,但是redis是将数据存储到内存上的,怎么就能够持久化数据呢?这是因为redis在硬盘中也是存储了数据的。

为了保证查询的速度够快,数据肯定是得在内存中的,但是为了持久,就必须存储在硬盘上,此时这两份数据理论上是完全相同的,实际上可能会存在一点差异,差异主要取决于用户如何进行数据的持久化操作的。

当查询某个数据的时候,在redis中还是直接从内存中读取数据,硬盘的数据只不过是在redis重启的时候,用来恢复内存中的数据。

2.持久化策略

RDB
RDB(Redis Database)简单地说,可以理解为定期备份。

举个栗子:
身为八尺男孩怎么可能会没有一点学习资料嘞,那肯定是有的兄弟,所以呢,我害怕某天我的电脑硬盘炸了,那我的学习资料不就毁于一旦了吗,那可是我目前毕身的心血。

所以我搞了一个移动硬盘,或者搞个网盘也是可以的,我会每周对新找到的学习资料进行上传到我的移动硬盘或者网盘中,这样即使我电脑的硬盘炸了,我的学习资料依旧在我的备份盘中。

AOF
AOF(Append Only File),简单地说,可以理解为实时备份。

举个栗子:
我记得我在同学的苹果手机上看到过,IOS系统上有个iCloud这个玩意儿,我每次看到我同学搞了新照片,这个苹果手机就会对照片啊啥的进行实时备份,也就是说一旦有新的数据进入手机,就会对数据进行备份。

二.RDB

1.快照

RDB定期的把Redis内存中的所有数据都写入硬盘中,生成一个"快照"。

“快照"简单地说就是记录下当前redis给内存中存储的数据,将这些"快照"后的"照片”,生成一个文件,存储到硬盘中。

后续redis重启服务器了(内存数据就会丢失),就可以根据刚才的"快照"就能够把内存中的数据给恢复回来。

2.“定期”

定期的方式有两种,一种是手动触发,另外一种则是自动触发。

手动触发
程序员通过redis客户端,执行特定的命令来触发快照的生成,主要是两个命令,一个是save,另一个是bgsave。

save: 执行save命令后,redis就会全力以赴的快照的生成操作,此时就会阻塞redis的其他客户端的命令,导致类似于keys *的后果,所以一般不建议使用save

bgsave: bg是background的缩写,这个命令执行后则不会影响redis服务器处理其他客户端的请求和命令。此处redis并不是通过多线程的方式进行的并发编程,而是通过多进程的方式实现的并发编程。

bgsave命令的工作流程:

  1. 父进程就是redis的服务器,当接收到bgsave的命令后,会先判断当前是否已经存在其他正在工作的子进程,如果此时已经有子进程正在执行bgsave,此时就直接把当前的bgsave返回。

  2. 如果当前没有其他正在工作的子进程,就通过fork创建一个子进程。

fork

(fork:是Linux系统提供的一个创建子进程的API,但是在其他系统中创建子进程就不是fork。fork创建子进程是通过简单粗暴地复制方式来创建子进程的。一旦复制完成,父子进程就是两个独立的进程,各自就会执行各自的)

fork中的复制一份,会将父进程中的pcb,虚拟地址空间,文件描述符表……都会完全的复制。此时redis服务器中原本就有若干的变量而且也保存了一些键值对数据,因为fork的执行,子进程的这个内存里也会存在和刚才父进程中一模一样的变量。

因此,通过子进程执行持久化操作,也就相当于把父进程本体的内存数据进行了持久化了。如果父进程打开一个文件还进行了fork,那么子进程也是可以使用这个文件,也就导致了子进程持久化写入的那个文件和父进程的本来要写的文件是同一个。

如果,当前redis 服务器中存储的数据很多,内存消耗特别大,此时进行上述的复制操作,性能的开销其实不是很大,因为fork在进行内存拷贝的时候,不是简单的直接把所有数据都拷贝一遍,而是通过“写时拷贝”的机制来完成的。

如果子进程内存里的内存数据和父进程的内存数据完全一样,此时就不会真正的触发拷贝动作,而是两个进程共用同一份的数据。因为这两个进程的内存空间是相互独立的,只有当某一个进程的内存数据修改了之后才会触发真正物理内存上的数据拷贝。

  1. 子进程负责进行写文件,生成快照的过程,父进程继续接收客户端的请求,继续正常的提供服务。
  2. 子进程完成整体的持久化过程之后,就会通知父进程已经执行完毕,于是父进程就会更新一些统计信息,子进程就可以销毁了。
    在这里插入图片描述

RDB的镜像文件

redis生成的RDB文件是存放在redis的工作目录中的,所谓的工作目录也是在redis 的配置文件中进行设置的。

存放的目录:在这里插入图片描述
这个目录下会有一个rdb机制生成的镜像文件(redis服务器是默认开启了rdb的),当执行了生成rdb镜像操作的时候,此时就会把要生成的快照数据,先保存到一个临时文件中,当这个快照生成完毕之后,再删除之前的rdb文件,再把新生成的临时rdb文件名改成刚才的文件名。

3.RDB演示

(1)手动执行save&bgsave触发一次生成快照

插入数据后进行了手动的备份生成了快照:
在这里插入图片描述
先通过cd /etc/redis/的命令后,在通过 vim redis.conf找到rdb文件,在通过cd /var/lib/redis 和 vim dump.rdb文件查看里面的快照信息:
在这里插入图片描述
重启后服务器,通过rdb恢复了之前的数据:在这里插入图片描述

(2)插入key,不手动执行bgsave

如果通过正常流程重新启动redis服务器,此时redis服务器会在退出的时候,自动触发生成rdb操作,但是如果是异常重启(kill -9或者服务器掉电)此时redis服务器来不及生成rdb,内存中尚未保存到快照中的数据就会随着系统重启而丢失。

此时再插入一条key,并且没有执行bgsave操作:
在这里插入图片描述
此时重启服务器后,key4的仍然存在:
redis生成快照的操作,不仅仅是手动执行命令才触发的,也可以自动触发。
在这里插入图片描述

1)可以通过配置文件中save执行M时间内,修改N次的方式进行自动触发。在这里插入图片描述

2)通过shutdown命令(redis的命令)关闭redis服务器也会触发。(service redis-server restart属于正常关闭)

3)redis进行主从复制的时候,主节点也会自动生成rdb快照,然后把rdb快照文件内容传输给从节点。

此时在插入一条key,此时直接使用kill杀死redis服务器

此时通过将原来的redis服务器的端口号进行杀死,虽然此时redis服务器换了其他的端口号存在,但是这时的redis服务器属于重新启动了。

在这里插入图片描述
此时模拟redis服务器崩溃后,重新进入redis客户端,此时key5就不存在在这里插入图片描述

(3)执行bgsave后,新旧文件的替换

通过Linux的stat命令,查看文件的inode编号,就可以知道文件是否改变。

执行bgsave之前的inode
在这里插入图片描述
执行bgsave后的inode
在这里插入图片描述
此时文件已经不是同一个文件了,只不过内容是一样的,因为inode就类似于文件的身份标识符。如果上述操作使用的命令是save,则不会触发子进程和文件替换的逻辑,而是直接在当前进程中,往刚才的同一个文件中写入数据了。

Linux的文件系统典型的组织方式(ext4),主要是把这个文件系统分成了三个大的部分

  1. 超级块(放的是一些管理信息)
  2. inode区(存放inode节点,每个文件都会分配一个inode数据结构,包含了文件的各种元数据)
  3. block区,存放文件的数据内容。

(4)通过配置自动生成rdb快照

通过配置文件中自动生成rdb的属性进行更改,更改后,还需要重新启动服务器

如果设置成save ""则关闭自动生成快照

在这里插入图片描述
此时在进行插入2个数据后,等待60秒后观察dump.rdb文件信息:
在这里插入图片描述
在这里插入图片描述

(5)rdb文件内容被故意删改

将rdb文件内容随便删改后,需要通过kill -9的方式来进行重启服务器,不然redis的服务器通过restart的命令则会在结束服务器的时候重新生成一个快照(rdb)文件,此时原来修改过的rdb文件则被覆盖了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时更改了rdb文件的内容,如果是更改的末尾,一般来说还是能够获取到key的值的,但是如果更改的是文件写好的内容,此时就会导致redis 的服务器没办法重启了.
在这里插入图片描述
在这里插入图片描述

此时可以通过查看redis 的日志来观察报错信息。查看redis的日志信息,通过cd /var/log/redis,在通过ll 就能看到redis的日志文件,日志文件中,带有gz的是压缩包,所以直接vim redis-server.log就能够查看日志里面的信息了:
在这里插入图片描述
在这里插入图片描述

rdb文件是二进制的,直接就把改崩了的rdb文件交给redis服务器去使用,得到的结果是不可预期的,可能redis服务器能启动,但是得到的数据可能正确也可能有问题,也可能redis服务器直接启动失败。

redis也提供了rdb文件的检查工具,可以先通过检查工具,检查一下rdb文件格式是否符合要求,在把rdb文件交给服务器。

先通过cd /usr/bin进入检查工具的文件中,在使用**ll redis-***就可以看到redis中提供的检查工具了:

通过上述的指令输入后,就能够得到此时的rdb是存在问题的:
在这里插入图片描述

4.RDB的优缺点

RDB是⼀个紧凑压缩的⼆进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。

比如每6小时执行bgsave备份,并把RDB文件复制到远程机器或者文件系统中(如hdfs)用于灾备。

  • Redis加载RDB恢复数据远远快于AOF的方式。
  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有风险

四.AOF

1.AOF的简介

AOF类似于MySQL中的binlog,会把用户的每个操作,都记录到文件中,当redis重新启动的时候,就会读取这个AOF文件中的内容,用来恢复数据,当AOF开启时,RDB就不在生效了。

AOF的功能是默认关闭的,所以需要手动打开,先使用cd /etc/redis后,再使用vim redis.conf进入配置文件,将appendonly no的no改成yes即可,红色的字体是
在这里插入图片描述

此时设置一些key,就可以在AOF的文本文件中找到(通过cd /var/lib/redis进入这个目录中,在通过vim appendonly.aof进入到AOF文件中,因为此时AOF已经开启了,所以即使dump.drb文件是该崩溃的,也没有关系 ):
在这里插入图片描述
即使此时将redis服务器使用kill杀死,在重新启动redis服务器后,数据还是会存在:
在这里插入图片描述

2.AOF是否影响Redis性能

AOF机制并没有降低redis处理请求的速度,因为AOF机制并非是直接让工作线程把数据写入硬盘,而是先写入一个内存中的缓存区,积累一波之后,再统一写入硬盘。

AOF的内存缓存区降低了写硬盘的次数,并且AOF是把每次新的操作写入到原有文件的末尾,属于顺序写入,而不是随机访问,这样速度就不会很慢,但是还是比内存的速度要慢很多。

在这里插入图片描述

3.缓冲区刷新策略

如果把数据写入到缓存区里,本质还是在内存中,此时如果进程突然挂了或者主机掉电了,缓存区的数据就会丢失。

于是redis给出了一些选项,可以让用户根据实际情况做出取舍,这也就诞生了缓冲区的刷新策略,在redis中的配置文件(redis.conf)修改appendfsync参数来控制不同值下的缓冲区刷新策略:
在这里插入图片描述

  1. always:频率最高,数据可靠性最高,但是性能最低。
  2. everysec:频率会低一些,数据可靠性也会低一些,但是性能提高了一些。
  3. no:频率最低,数据可靠性最低,性能最高。

4.AOF重写机制

AOF文件持续增长,体积就会越来越大,这样会影响到redis下次启动的启动时间,因为redis启动的时候要读取AOF文件的内容,但是AOF中的文件,会有一些冗余内容。

于是redis就存在了一个重写机制来针对AOF文件进行了整理操作,这个整理能够剔除其中的冗余操作,并且合并一些操作,达到给AOF文件瘦身的效果。

AOF的重写机制也分成两种,一种手动触发,一种自动触发

手动触发是通过bgrewriteaof

自动触发是通过配置文件根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参数确定自动触发时机。

  • auto-aof-rewrite-min-size:表示触发重写时AOF的最小文件大小,默认为64MB。
  • auto-aof-rewrite-percentage:代表当前AOF占用大小相比较上次重写时增加的比例

(1)重写流程

自动和手动触发的流程图差不多:
在这里插入图片描述

创建子进程的fork和RDB中是一样的,此处不再过多赘述,父进程也是仍然负责接收请求,子进程负责针对AOF文件进行重写。重写的时候不会关心AOF文件中原来存在那些数据,只关心内存中最终的数据状态。

子进程只需要把内存中当前的数据获取出来,以AOF的格式写入到一个新的AOF文件中即可,内存中数据的状态,就已经相当于是把AOF文件结果整理后的模样了。

子进程写新AOF文件的同时,父进程仍然在不停的接收客户端的新请求,父进程还是会把这些请求产生的AOF数据先写入到缓存区中,再刷新到原有的AOF文件里。

在创建子进程的一瞬间,子进程就继承了当前父进程的内存状态,因此,子进程力的内存数据是父进程fork之前的状态,fork之后,父进程收到的新请求导致对内存造成的修改,子进程是不知道的。

此时父进程在又准备了一个aof_rewrite_buf缓冲区,专门放fork之后接收到的数据,子进程把AOF数据写完之后会通过信号通知父进程。父进程再把aof_rewrite_buf缓冲区中的内容也写到新的AOF文件中,此时新的AOF文件就可以替代旧的AOF文件了。

(2)重写流程中的问题

如果在执行bgrewriteaof的时候,当前redis正在进行AOF重写,此时就不会再次执行AOF重写,直接就返回了。但如果redis是在生成rdb文件的快照,此时AOF重写操作就会进行等待,当rdb快照生成完毕之后,在执行AOF重写。

rdb对于fork之后的新数据就直接不做处理,AOF则对于fork之后的新数据,采取了aof_rewrite_buf缓冲区的方式来处理。

这不过只是因为rdb本身的设计理念就是定期备份,定期备份肯定没办法想实时更新的备份一样和原数据进行保持一致。

父进程fork完毕之后,已经让子进程写新的AOF文件了,随着时间的推移,子进程很快就写完了新的文件,于是让新的AOF文件代替旧的。此时父进程还在继续写即将消亡的旧文件是有意义的。

如果在重写过程中,这个过程只执行了一半,此时服务器挂了,子进程内存的数据就会丢失,新的AOF文件内容还不是完整的,所以如果父进程不坚持写旧的AOF文件,重启就没办法保证数据的完整性了。

5.混合持久化

AOF原本是按照文本的方式写入文件的,但是文本的方式写文件,后续加载的成本是比较高的,于是redis就引入了混合持久化的方式,结合了rdb和aof的特点。

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

此时创建几条数据后,AOF还是文本数据类型:在这里插入图片描述

在这里插入图片描述

此时启动bgrewriteaof就开始实时备份数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果此时再加入一个数据,此时后续添加的也是文本数据:
在这里插入图片描述

上述的混合持久化可以通过配置文件中的aop-use-rdb-preamble yes中的yes改成no则不会进行混合持久化操作了,如果修改了之后就需要重启服务器。

redis同时存在AOF文件和RDB文件,此时还是以AOF为主,下图是解释图:
在这里插入图片描述

相关文章:

Redis持久化

Redis持久化 一.认识持久化1.简单介绍2.持久化策略 二.RDB1.快照2."定期"fork 3.RDB演示(1)手动执行save&bgsave触发一次生成快照(2)插入key,不手动执行bgsave(3)执行bgsave后,新旧文件的替换(4)通过配置自动生成rdb快照(5)rdb文件内容被故…...

什么是 k8s 的 Taints(污点) 和 Tolerations(容忍度)

什么是 k8s 的 Taints(污点) 和 Tolerations(容忍度) 在 Kubernetes(K8s)中,Taints(污点)和 Tolerations(容忍度)用于影响 Pod 调度到节点的行为…...

是德科技KEYSIGHT校准件85039B

是德科技KEYSIGHT校准件85039B 是德科技KEYSIGHT校准件85039B 85039B Agilent | 85039B|校准件|网络分析仪校准件|3GHz|75欧|N型 品牌: 安捷伦 | Agilent | 惠普 | HP 主要技术指标 DC to 3GHz frequency range 主要描述 常用型号: 一、频谱分析仪或…...

以UE5第三方插件库为基础,编写自己的第三方库插件,并且能够在运行时复制.dll

首先,创建一个空白的C 项目,创建第三方插件库。如下图所示 编译自己的.Dll 和.lib 库,打开.sln 如下图 ExampleLibrary.h 的代码如下 #if defined _WIN32 || defined _WIN64 #define EXAMPLELIBRARY_IMPORT __declspec(dllimport) #elif d…...

StarRocks执行原理与SQL性能优化策略探索

https://zhuanlan.zhihu.com/p/15707561363 聚合优化实践 -- 通过count group by 优化 count distinct数据倾斜问题 除了前面所说的聚合度会对分组聚合造成比较大的影响外,我们还要考虑一个点,即数据倾斜问题。 背景: 如下为最初的用户计算uv的SQL SE…...

Java全栈面试宝典:JMM内存模型与Spring自动装配深度解析

目录 一、Java内存模型(JMM)核心原理 🔥 问题8:happens-before原则全景解析 JMM内存架构图 happens-before八大规则 线程安全验证案例 🔥 问题9:JMM解决可见性的三大武器 可见性保障机制 volatile双…...

拉普拉斯变换

【硬核】工科生都逃不掉的拉氏变换,居然又炫酷又实用|拉普拉斯变换原理、图解与应用,傅里叶变换进阶,控制理论必修课【喵星考拉】...

JavaScript之Json数据格式

介绍 JavaScript Object Notation, js对象标注法,是轻量级的数据交换格式完全独立于编程语言文本字符集必须用UTF-8格式,必须用“”任何支持的数据类型都可以用JSON表示JS内内置JSON解析JSON本质就是字符串 Json对象和JS对象互相转化 前端…...

Android WiFi协议之P2P介绍与实践

Android WiFi P2P WiFi P2P (Peer-to-Peer) 是 Android 提供的一种允许设备之间直接通过 WiFi 进行通信的技术,无需接入传统的 WiFi 网络或互联网。这种技术也被称为 WiFi Direct。 一、WiFi P2P 基本概念 1. 核心组件 P2P 设备:支持 WiFi P2P 的 And…...

android TabLayout中tabBackground和background的区别

在这段代码中,android:background"color/white" 和 app:tabBackground"android:color/transparent" 是两个不同的属性,它们的作用范围和用途完全不同。以下是它们的区别: 1. android:background 作用: 设置整…...

使用 `keytool` 生成 SSL 证书密钥库

使用 keytool 生成 SSL 证书密钥库:详细指南 在现代 Web 应用开发中,启用 HTTPS 是保护数据传输安全性和增强用户体验的重要步骤。对于基于 Java 的应用,如 Spring Boot 项目,keytool 是一个强大的工具,用于生成和管理…...

DC-DC电路和LDO电路

一、DC-DC电路 在电子电路中,将输入的直流电压转换为电路中所需要的直流电压的电路被称为DC-DC电源电路。 1、buck电路(降压电路) 功能:把12V输入电压转化为5V的输出电压。 上图中电池为12V供电,需要给负载输出5V电…...

智谛达科技引领AI人形机器人新时代

在这个科技日新月异的时代,人工智能(AI)如同一股不可阻挡的洪流,以前所未有的速度改变着我们的生活方式、工作模式乃至整个社会的运行逻辑。而在这场波澜壮阔的科技革命中,智谛达科技集团凭借其深厚的技术底蕴、前瞻性的战略眼光以及在AI人形机器人领域的深厚积累,正引领着整个…...

在ubuntu24上装ubuntu22

实验室上有一台只装了ubuntu24的电脑,但是项目要求在22上进行 搞两个ubuntu系统! 步骤一:制作22的启动盘 步骤二:进入bios安装界面 步骤三:选择try or install ubuntu 步骤四:选择try ubuntu 步骤五&…...

高精度算法

高精度加法 输入两个数&#xff0c;输出他们的和&#xff08;高精度&#xff09; 输入样例 111111111111111111111111111111 222222222222222222222222222222 输出样例 333333333333333333333333333333 #include <bits/stdc.h> using namespace std;string a,b; in…...

2019年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析

2019年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...

UIMeter-UI自动化软件(产品级)

前言&#xff1a;作为一个资深测试工程师&#xff0c;UI测试&#xff0c;webUI自动化测试是我们必备的技能&#xff0c;我们都知道常用的框架比如selenium、playwright、rebootframwork等等&#xff0c;但是无论哪一种框架&#xff0c;都需要测试人员去编写代码&#xff0c;进行…...

Porting Layer - 跨平台函数接口封装(RTOS/Windows)- C语言

目录 概述具体实现使用说明 概述 在嵌入式开发中&#xff0c;一般会在某个开发板上某个系统上实现某个功能&#xff0c;为了开发模块的移植性更好&#xff0c;因此需要对不同的操作系统有一层封装层。当换一个操作系统时&#xff0c;模块中的code不用修改&#xff0c;只需要根…...

Kafka负载均衡挑战解决

本文为 How We Solve Load Balancing Challenges in Apache Kafka 阅读笔记 kafka通过利用分区来在多个队列中分配消息来实现并行性。然而每条消息都有不同的处理负载&#xff0c;也具有不同的消费速率&#xff0c;这样就有可能负载不均衡&#xff0c;从而使得瓶颈、延迟问题和…...

Docker Compose 常用命令 运行 docker-compose.yaml

Docker Compose 中有两个重要的概念 服务 (service)&#xff1a;一个应用的容器&#xff0c;实际上可以包括若干运行相同镜像的容器实例。 项目 (project)&#xff1a;由一组关联的应用容器组成的一个完整业务单元&#xff0c;在 docker-compose.yml 文件中定义。 为了更方便…...

Kafka的索引设计有什么亮点

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Kafka的索引设计有什么亮点&#xff1f; Kafka 之所以能在海量数据的传输和处理过程中保持高…...

基于大模型的病态窦房结综合征预测及治疗方案研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、病态窦房结综合征概述 2.1 定义与病因 2.2 临床表现与分型 2.3 诊断方法 三、大模型在病态窦房结综合征预测中的应用 3.1 大模型介绍 3.2 数据收集与预处理 3.3 模型训练与优化 四、术前预测与准备 4.1 风险预…...

音视频入门基础:RTCP专题(5)——《RFC 3550》的附录A

一、引言 本文对应《RFC 3550》的附录A&#xff08;Appendix A. Algorithms&#xff09;。 二、Appendix A. Algorithms 根据《RFC 3550》第62页&#xff0c;《RFC 3550》提供了有关RTP发送方和接收方算法的C代码示例。在特定的运行环境下&#xff0c;可能还有其他更快或更有…...

qemu仿真调试esp32,以及安装版和vscode版配置区别

不得不说&#xff0c;乐鑫在官网的qemu介绍真的藏得很深 首先在首页的sdk的esp-idf页面里找找 然后页面拉倒最下面 入门指南 我这里选择esp32-s3 再点击api指南-》工具 才会看到qemu的介绍 QEMU 模拟器 - ESP32-C3 - — ESP-IDF 编程指南 latest 文档https://docs.espressi…...

协方差相关问题

为什么无偏估计用 ( n − 1 ) (n-1) (n−1) 而不是 n n n&#xff0c;区别是什么&#xff1f; 在统计学中&#xff0c;无偏估计是指估计量的期望值等于总体参数的真实值。当我们用样本数据估计总体方差或协方差时&#xff0c;分母使用 ( n − 1 ) (n-1) (n−1) 而不是 n n…...

Android OpenCV 人脸识别 识别人脸框 识别人脸控件自定义

先看效果 1.下载OpenCV 官网地址&#xff1a;opcv官网 找到Android 4.10.0版本下载 下载完毕 解压zip如图&#xff1a; 2.将OpenCV-android_sdk导入项目 我这里用的最新版的Android studio 如果是java开发 需要添加kotlin的支持。我用的studio比较新可以参考下&#xff0c;如果…...

深入解析Linux软硬链接:原理、区别与应用实践

Linux系列 文章目录 Linux系列前言一、软硬链接的概念引入1.1 硬链接1.2 软链接 二、软硬链接的使用场景2.1 软链接2.2 硬链接 三、总结 前言 上篇文章我们详细的介绍了文件系统的概念及底层实现原理&#xff0c;本篇我们就在此基础上探讨Linux系统中文件的软链接&#xff0…...

TDengine 与 taosAdapter 的结合(二)

五、开发实战步骤 &#xff08;一&#xff09;环境搭建 在开始 TDengine 与 taosAdapter 结合的 RESTful 接口开发之前&#xff0c;需要先完成相关环境的搭建&#xff0c;包括 TDengine 和 taosAdapter 的安装与配置&#xff0c;以及相关依赖的安装。 TDengine 安装&#xf…...

OBS 中如何设置固定码率(CBR)与可变码率(VBR)?

在使用 OBS 进行录制或推流时,设置“码率控制模式”(Rate Control)是非常重要的一步。常见的控制模式包括: CBR(固定码率):保持恒定的输出码率,适合直播场景。 VBR(可变码率):在允许的范围内动态调整码率,适合本地录制、追求画质。 一、CBR vs. VBR 的差异 项目CBR…...

优艾智合人形机器人“巡霄”,开启具身多模态新时代

近日&#xff0c;优艾智合-西安交大具身智能机器人研究院公布人形机器人矩阵&#xff0c;其中轮式人形机器人“巡霄”首次亮相。 “巡霄”集成移动导航、操作控制与智能交互技术&#xff0c;具备跨场景泛化能&#xff0c;适用于家庭日常服务、电力设备巡检、半导体精密操作及仓…...

蓝桥杯小白打卡第七天(第十四届真题)

小蓝的金属冶炼转换率问题 小蓝有一个神奇的炉子用于将普通金属 (O) 冶炼成为一种特殊金属 (X) 。 这个炉子有一个称作转换率的属性 (V) &#xff0c;(V) 是一个正整数&#xff0c;这意味着消耗 (V) 个普通金属 (O) 恰好可以冶炼出一个特殊金属 (X) &#xff0c;当普通金属 (…...

excel经验

Q:我现在有一个excel&#xff0c;有一列数据&#xff0c;大概两千多行。如何在这一列中 筛选出具有关键字的内容&#xff0c;并输出到另外一列中。 A: 假设数据在A列&#xff08;A1开始&#xff09;&#xff0c;关键字为“ABC”在相邻空白列&#xff08;如B1&#xff09;输入公…...

【Pandas】pandas DataFrame astype

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型 pandas.DataFrame.astype pandas.DataFrame.astype 是一个方法&#xff0c;用于将 DataFrame 中的数据转换为指定的数据类型。这个方法非常…...

【Netty4核心原理④】【简单实现 Tomcat 和 RPC框架功能】

文章目录 一、前言二、 基于 Netty 实现 Tomcat1. 基于传统 IO 重构 Tomcat1.1 创建 MyRequest 和 MyReponse 对象1.2 构建一个基础的 Servlet1.3 创建用户业务代码1.4 完成web.properties 配置1.5 创建 Tomcat 启动类 2. 基于 Netty 重构 Tomcat2.1 创建 NettyRequest和 Netty…...

4.6学习总结

包装类 包装类&#xff1a;基本数据类型对应的引用数据类型 JDK5以后新增了自动装箱&#xff0c;自动拆箱 以后获取包装类方法&#xff0c;不需要new&#xff0c;直接调用方法&#xff0c;直接赋值即可 //1.把整数转成二进制&#xff0c;十六进制 String str1 Integer.toBin…...

MySQL学习笔记五

第七章数据过滤 7.1组合WHERE子句 7.1.1AND操作符 输入&#xff1a; SELECT first_name, last_name, salary FROM employees WHERE salary < 4800 AND department_id 60; 输出&#xff1a; 说明&#xff1a;MySQL允许使用多个WHERE子句&#xff0c;可以以AND子句或OR…...

成为社交场的导演而非演员

一、情绪的本质&#xff1a;社交信号而非自我牢笼 进化功能&#xff1a;情绪是人类进化出的原始社交工具。愤怒触发群体保护机制&#xff0c;悲伤唤起同情支持&#xff0c;喜悦巩固联盟关系。它们如同可见光谱&#xff0c;快速传递生存需求信号。双刃剑效应&#xff1a;情绪的…...

怎么使用vue3实现一个优雅的不定高虚拟列表

前言 很多同学将虚拟列表当做亮点写在简历上面&#xff0c;但是却不知道如何手写&#xff0c;那么这个就不是加分项而是减分项了。实际项目中更多的是不定高虚拟列表&#xff0c;这篇文章来教你不定高如何实现。 什么是不定高虚拟列表 不定高的意思很简单&#xff0c;就是不…...

LemonSqueezy: 1靶场渗透

LemonSqueezy: 1 来自 <LemonSqueezy: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.225 3&#xff0c;对靶机进…...

2025 年山东保安员职业资格考试要点梳理​

山东作为人口大省&#xff0c;保安市场规模庞大。2025 年考试报考条件常规。报名通过山东省各市公安机关指定的培训机构或政务服务窗口&#xff0c;提交资料与其他地区类似。​ 理论考试注重对山东地域文化特色相关安保知识的考查&#xff0c;如在孔庙等文化圣地安保中&#x…...

ARM处理器内核全解析:从Cortex到Neoverse的架构与区别

ARM处理器内核全解析&#xff1a;从Cortex到Neoverse的架构与区别 ARM作为全球领先的处理器架构设计公司&#xff0c;其内核产品线覆盖了从高性能计算到低功耗嵌入式应用的广泛领域。本文将全面解析ARM处理器的内核分类、架构特点、性能差异以及应用场景&#xff0c;帮助读者深…...

网络缓冲区

网络缓冲区分为内核缓冲区和用户态网络缓冲区 我们重点要实现用户态网络缓冲区 1.设计用户态网络缓冲区的原因 ①.生产者和消费者的速度不匹配问题&#xff0c; 需要缓存数据。 ②.粘包处理问题&#xff0c; 不能确保一次系统调用读取或写入完整数据包。 2.代码实现(cha…...

数据仓库的核心架构与关键技术(数据仓库系列二)

目录 一、引言 二、数据仓库的核心架构 三、数据仓库的关键技术 1 数据集成与治理 2 查询优化与性能提升 3 数据共享服务 BI&#xff1a;以Tableau为例 SQL2API&#xff1a;以麦聪QuickAPI为例 4 实时数据处理 四、技术的协同作用 五、总结与展望 六、预告 一、引言…...

基于PyQt5与OpenCV的图像处理系统设计与实现

1. 系统概述 本系统是一个集成了多种经典图像处理算法的图形用户界面(GUI)应用程序,采用Python语言开发,基于PyQt5框架构建用户界面,利用OpenCV库实现核心图像处理功能。 系统支持11种图像处理操作,每种操作都提供参数实时调节功能,并具备原始图像与处理后图像的双视图对…...

如何根据设计稿进行移动端适配:全面详解

如何根据设计稿进行移动端适配&#xff1a;全面详解 文章目录 如何根据设计稿进行移动端适配&#xff1a;全面详解1. **理解设计稿**1.1 设计稿的尺寸1.2 设计稿的单位 2. **移动端适配的核心技术**2.1 使用 viewport 元标签2.1.1 代码示例2.1.2 参数说明 2.2 使用相对单位2.2.…...

什么是大型语言模型(LLM)?哪个大模型更好用?

什么是 LLM&#xff1f; ChatGPT 是一种大型语言模型 (LLM)&#xff0c;您可能对此并不陌生。它以非凡的能力而闻名&#xff0c;已证明能够出色地完成各种任务&#xff0c;例如通过考试、生成产品内容、解决问题&#xff0c;甚至在最少的输入提示下编写程序。 他们的实力现已…...

集合学习内容总结

集合简介 1、Scala 的集合有三大类&#xff1a;序列 Seq、集Set、映射 Map&#xff0c;所有的集合都扩展自 Iterable 特质。 2、对于几乎所有的集合类&#xff0c;Scala 都同时提供了可变和不可变的版本&#xff0c;分别位于以下两个包 不可变集合&#xff1a;scala.collect…...

使用typedef和不使用的区别

使用 typedef 定义的函数指针类型 typedef sensor_drv_params_t* (*load_sensor_drv_func)(); 不使用 typedef 的函数指针声明 sensor_drv_params_t* (*load_sensor_drv_func)(); 这两者看似相似&#xff0c;但在语义和用途上有显著区别。下面将详细解释这两种声明的区别、各…...

基于线性回归模型的汽车燃油效率预测

基于线性回归模型的汽车燃油效率预测 1.作者介绍2.线性回归介绍2.1 线性回归简介2.2 线性回归应用场景 3.基于线性回归模型的汽车燃油效率预测实验3.1 Auto MPG Data Set数据集3.2代码调试3.3完整代码3.4结果展示 4.问题分析 基于线性回归模型的汽车燃油效率预测 1.作者介绍 郝…...

Playwright之自定义浏览器目录访问出错:BrowserType.launch: Executable doesn‘t exist

Playwright之自定义浏览器目录访问出错&#xff1a;BrowserType.launch: Executable doesn’t exist 问题描述&#xff1a; 在使用playwright进行浏览器自动化的时候&#xff0c;配置了自定义的浏览器目录&#xff0c;当按照自定义的浏览器目录启动浏览器进行操作时&#xff0c…...