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

#Redis缓存篇#(七)分布式缓存

目录

一 单节点Redis

1 单节点的问题

二 分布式缓存

1 Redis持久化

(1 RDB持久化

(2 AOF持久化

2 Redis主从集群

(1 搭建主从架构

(2 主从数据同步原理

3 Redis哨兵

(1 哨兵的作用和原理

(2 搭建哨兵集群

(3 RedisTemplate的哨兵模式

4 Redis分片集群

(1 搭建分片集群

(2 散列插槽

核心作用

工作机制

(3 集群伸缩

(4 故障转移

自动故障恢复


一 单节点Redis

1 单节点的问题

二 分布式缓存

1 Redis持久化

(1 RDB持久化

RDB持久化(Redis Database Backup file)Redis数据备份文件,也被叫做Redis数据快照。简单来说就是把内存中所有数据都记录到磁盘当中。当Redis实例故障重启后,从磁盘当中读取快照文件,恢复数据。

  • 在Redis停止那一刻自动触发一次save(停机时自动save)默认开启。
  • 可在配置文件当中设置3600秒内如果有1个key被修改则执行bgsave(自动save)默认关闭。

其他的一些配置参数(是否压缩/修改保存文件名称/文件保存的目录)

save "" 禁用RDB持久化

fork机制

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。

  1. 触发 BGSAVE

    • 通过配置文件自动触发(如 save 60 10000)或手动执行 BGSAVE 命令。

  2. fork() 子进程

    • 主进程短暂阻塞(时间取决于内存页表大小),生成子进程。

  3. 子进程持久化

    • 子进程遍历内存数据,按二进制格式写入 RDB 文件。

    • 主进程继续处理请求,修改数据时触发 COW(copy-on-write)。

  4. 完成持久化

    • 子进程写入完成后退出,主进程清理临时文件并更新 RDB 文件。

从主进程fork到子进程的过程当中需要阻塞,我们需要尽可能的缩短

1 该流程图的简单解释:

  1. 主进程启动bgsave:当需要生成RDB快照时,主进程调用fork()创建一个子进程。

  2. 复制页表:子进程复制主进程的页表(内存地址映射表),此时两者共享同一份物理内存数据。

  3. 子进程写入RDB:子进程基于复制的页表,读取内存中的数据(如数据A、数据B),并将其写入新的RDB文件。

  4. 主进程继续运行:主进程仍能处理客户端请求。如果主进程修改了数据(例如修改数据A),操作系统会通过写时复制(COW)copy-on-write 复制被修改的内存页,主进程使用新副本,子进程仍用旧数据写入RDB。

  5. 替换旧文件:子进程完成RDB写入后,用新生成的RDB文件替换磁盘上的旧文件,持久化完成。

关键点

  • fork()只复制页表,不复制内存,速度快。

  • 写时复制保证子进程生成的是fork()瞬间的数据快照。

  • 主进程无阻塞,全程可正常响应请求。

2 页表的概念:

  • 作用
    页表记录了虚拟内存页(Page)与物理内存页框(Page Frame)的映射关系。每个进程拥有独立的页表,确保其虚拟地址空间与其他进程隔离。

  • 虚拟地址与物理地址的转换

    • 虚拟地址被划分为 页号(Page Number) 和 页内偏移(Offset)

    • 通过页号查找页表,得到对应的物理页框号(Frame Number),再结合页内偏移得到物理地址。(详单与页数与具体位置,以此来对应的查找到具体的物理内存地址)

3 RDB持久化优点:

  1. 高性能:fork子进程处理数据保存,主进程无阻塞。

  2. 紧凑备份:二进制快照文件小,适合全量备份与灾难恢复。

  3. 快速恢复:直接加载数据,比AOF日志重放更快(尤其大数据量时)。

4 RDB持久化缺点:

  1. 数据丢失风险:两次快照间的数据可能丢失(依赖配置的保存周期)。

  2. 潜在阻塞:数据集大时,fork子进程可能短暂影响主进程响应(尤其内存占满时)。

核心权衡:牺牲实时数据安全性,换取更高吞吐与恢复效率。

  • RDB适合:能接受“丢几分钟数据”但追求速度的场景,比如每天0点备份用户积分(丢几分钟积分无所谓,恢复快更重要)。

  • RDB不适合:银行转账系统(1秒都不能丢),这时得用AOF日志(记录每一笔操作)。

(2 AOF持久化

AOF全称位Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。AOF是默认关闭的需要人为开启。

1 bgwrite

触发条件(后台异步执行)

  • 手动触发:执行 BGREWRITEAOF 命令。

  • 自动触发:根据 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 配置(如 AOF 文件比上次重写后增长 100% 且大小超过 64MB)。

auto-aof-rewrite-percentage 100  # 比上次重写后增长100%时触发
auto-aof-rewrite-min-size 64mb   # AOF文件至少达到64MB

思考:那两种方案各有优点为什么不把两种方案都开启呢?

这里是有版本的原因,在4.0版本之前两种同时开启是会出现两个文件,但是4.0版本之后支持混合持久化,将数据全部存储在aof的文件中,但是需要修改参数,开启AOF同时开启混合持久化。

# 开启AOF
appendonly yes
# 启用混合持久化(RDB头部 + AOF尾部)
aof-use-rdb-preamble yes
# 保留RDB的触发规则(可选)
save 900 1
  • 同时开启 RDB+AOF(任何版本)

    • 磁盘上会存在两个文件(.rdb 和 .aof)。

    • 恢复时需自行选择用 RDB 或 AOF(默认优先用 AOF)。

  • 混合持久化(仅 4.0+)

    • 只有一个 .aof 文件,但内部结构是 RDB 头部 + AOF 尾部

    • 恢复时自动结合两者优势,无需人工干预。

2 Redis主从集群

(1 搭建主从架构

实现:

创建三个文件夹用于管理并先将配置文件初始化

我们需要修改 1端口 2保存目录

修改每个实例的声明IP(虚拟机本身有多个ip为了避免将来混乱,在redis.conf文件当中指定每一个实例的绑定ip信息)

开启三个不同端口的redis

过程当中出现这个路径出错

现在三者之间还未形成主从的关系

设置7001这个端口的Redis为主节点(7002向7001发送请求请求同步)

设置7001这个端口的Redis为主节点(7003向7001发送请求请求同步)

查看7001的配置(7001为主节点同时两个slave子节点)

实现主从同步试验(这里的写只能在主节点当中,实现读写分离优化性能)

(2 主从数据同步原理

1 全量同步原理

“建立连接 → 版本校验 → 生成并传输RDB → 增量补漏”

当从节点(Slave)通过replicaof命令与主节点(Master)建立连接后,主节点首先会判断是否为第一次同步。如果是初次同步,主节点会将自己的数据版本标识(包含replidoffset)返回给从节点,从节点保存这些信息以标识数据来源和进度。

紧接着,主节点通过bgsave生成RDB快照(异步操作,避免阻塞主线程),将当前内存数据持久化为RDB文件并发送给从节点。从节点在接收到RDB后,清空本地旧数据并加载RDB文件,实现数据全量覆盖。

关键细节在于同步期间的写命令处理:主节点在生成RDB的过程中,依然会正常处理客户端的新写命令。这些命令会被暂存到复制缓冲区(repl_backlog)中,待RDB传输完成后,主节点再将缓冲区内的增量命令发送给从节点执行,最终确保主从数据完全一致。

主节点如何判断第一次同步?

repliid相同

Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每个Master都有唯一的replid,slave则会继承master节点的replid。

offset:偏移量,随着记录在repl_backlog中的数据增多而主键增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

2 增量同步原理

当从节点(Slave)重启且主节点(Master)未发生变更时(replid未改变),同步流程如下:

  1. ​从节点重启后发起同步请求​​:

    • 从节点向主节点发送 PSYNC 命令,携带自身的 replid 和 offset
    • 主节点检查 replid 是否一致:
      • 若一致,返回 +CONTINUE 响应,触发 ​​部分重同步​​。
      • 若不一致,触发全量同步。
  2. ​部分重同步流程​​:

    • 主节点通过 repl_backlog 环形缓冲区,找到从节点 offset 之后的未同步命令。
    • 将缺失的命令发送给从节点,从节点接收并执行,完成数据同步。

repl_backlog的大小有限,写满后会覆盖最早的数据。如果slave断开的时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次做全量同步。

3 命令传播原理

在主从集群在完成全量或增量同步后,主节点将后续新的写操作实时传递给节点的过程,确保主从数据持续一致。

客户端向主节点写入,主节点记录命令,主节点将命令写入缓冲区发送命令,从节点接受并执行

4 优化Redis主从集群同步的效率:

  • 1 在 master 中配置repl-diskless-sync yes 启用无磁盘复制,避免全量同步时的磁盘IO(网络较好,磁盘读取较差)
  • 2 Redis单节点的内存占用不要太大,减少RDB导致的过多磁盘IO。(设置合理的内存上限)
  • 3 适量增大repl_backlog的大小,在出现slave宕机重启后可以快速重启恢复,尽可能避免全量同步。
  • 4 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master的压力。

3 Redis哨兵

(1 哨兵的作用和原理

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。

1 服务状态监控

Sentinel基于心跳机制检测服务状态,每隔一秒向集群的每个实例发送ping命令。

  • 主观下线(SDOWN):如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
  • 客观下线(ODOWN):若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。(类似投票)

综上所述:必须要先主管下线才可实现客观下线,主观下线时一个人觉得你下线而客观下线是很多人觉得你下线,同时,客观下线才是真正的下线。

2 选举新的master

一旦发现master故障,sentinel需要在slave中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds*10)则会排除该slave节点。
  • 然后会判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举。
  • 如果slave-prority一样。则判断slave节点的offset值,越大说明数据越新,优先级越高。
  • 最后判断slave节点的运行id大小,越小优先级越高。

3 实现故障转移

当选中了其中一个slave为新的master后(例如slave1),故障的转移的步骤如下:

  • sentinel给备选的slave1节点发送slaveof no one 命令,让该节点成为master
  • sentinel给所有其他slave发送slaveof192.168.150.101 7002 命令,让这些slave成为新的master的从节点,开始从新的master上同步数据。
  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点。

(2 搭建哨兵集群

搭建一个三节点的Sentinel集群,来监管之前的Redis主从集群

三个sentinel实例的信息如下(ip根据自己的设置)

先创建文件夹

准备实例的配置文件(这里监控主节点master可以间接监控到slave节点的信息)

给对应的sentinel.conf 配置相关信息

port 27001
sentinel announce-ip 192.168.100.100
sentinel monitor mymaster 192.168.100.100 7001 2
sentinel down-after-milliseconds mymaster 500
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"
port 27003
sentinel announce-ip 192.168.100.100
sentinel monitor mymaster 192.168.100.100 7001 2
sentinel down-after-milliseconds mymaster 500
sentinel failover-timeout mymaster 60000
dir "/tmp/s3"
port 27002
sentinel announce-ip 192.168.100.100
sentinel monitor mymaster 192.168.100.100 7001 2
sentinel down-after-milliseconds mymaster 500
sentinel failover-timeout mymaster 60000
dir "/tmp/s2"

实现:

需要先搭建主从集群并配置

这里的哨兵集群需要先切换到对应的tmp文件目录,然后分别执行

redis-sentinel s1/sentinel.conf

redis-sentinel s2/sentinel.conf

redis-sentinel s3/sentinel.conf 从而开启

现在我们测试把redis7001给断了

7002与7003会出现报错(连不上主节点了)

哨兵会将主节点转换给slave节点

(3 RedisTemplate的哨兵模式

Redis集群监管下的redis主从集群,其节点会因为自动故障而发生变化,Redis的刻划断必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动转换。

4 Redis分片集群

(1 搭建分片集群

(2 散列插槽

核心作用

Redis 分片集群将数据划分为 16384 个散列插槽,每个键通过算法分配到唯一插槽,实现数据分片存储。

工作机制
  1. 键到插槽的映射

    • 计算公式:HASH_SLOT = CRC16(key) % 16384

    • 示例:键 user:1001 的 CRC16 值为 12345,则分配到插槽 12345 % 16384 = 12345

  2. 插槽分配到节点

    • 集群初始化时,管理员将 16384 个插槽手动或自动分配给各主节点(如 3 主节点各占约 5461 个槽)。

    • 节点负责存储其分配的槽对应的数据。

  3. 数据访问流程

    • 客户端请求键时,先计算插槽,再向负责该插槽的节点发起操作。

    • 若客户端连接的是错误节点,会收到 MOVED 重定向响应(包含正确节点地址)。

高效负载均衡,数据均匀分布,借助于动态哈希算法计算Key的归属插槽。在扩容或者出现宕机时,只需将部分插槽从现有节点迁移到新节点,无需全量数据重新分配

(3 集群伸缩

案例:难点插槽分配(7001的插槽分配给7004)

(4 故障转移

自动故障恢复
  1. 节点状态检测

    • 集群节点通过 Gossip 协议 定期交换心跳信息。

    • 若主节点 A 在超时时间内(默认 15 秒)无响应,其他节点将其标记为 PFAIL(疑似下线)。

  2. 故障确认

    • 当多数主节点确认主节点 A 不可达,将其标记为 FAIL(确认下线)。

  3. 从节点晋升

    • 主节点 A 的从节点发起选举,获得多数主节点投票后晋升为新主节点。

    • 客户端后续请求该插槽时,通过 MOVED 响应指向新主节点。

相关文章:

#Redis缓存篇#(七)分布式缓存

目录 一 单节点Redis 1 单节点的问题 二 分布式缓存 1 Redis持久化 (1 RDB持久化 (2 AOF持久化 2 Redis主从集群 (1 搭建主从架构 (2 主从数据同步原理 3 Redis哨兵 (1 哨兵的作用和原理 (2 搭…...

【VSCode】安装与 ssh 免密登录

【VSCode】安装与 ssh 免密登录 下载SSH 登录设置免密登录关闭远程连接删除ssh连接(慎用!!!删除了建立的连接就没有了!!) 下载 https://code.visualstudio.com/docs/?dvwin64user 选择安装路径…...

【Python解决八皇后问题】回溯算法与优化策略全解析

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现基础回溯实现位运算优化…...

判断一个元素是否在可视区域

判断元素是否在可视区域的方法 方法一:offsetTop 和 scrollTop 通过计算元素的 offsetTop 和容器的 scrollTop 来判断元素是否位于视口内。这种方法适用于简单的垂直滚动场景。 优点: 实现简单,性能较好。缺点: 不支持复杂的布局结构(如嵌套滚动),无法处理水平方向上的可…...

作物遗传与种质创新利用全国重点实验室-随笔10

作物遗传与种质创新利用全国重点实验室依托于南京农业大学,2022年11月完成国家重点实验室重组工作,由原名称“作物遗传与种质创新国家重点实验室”正式更名为“作物遗传与种质创新利用全国重点实验室”。 实验室面向国家粮食安全和农业高质量发展的重大战…...

分布式电源的配电网无功优化

分布式电源(Distributed Generation, DG)的大规模接入配电网,改变了传统单向潮流模式,导致电压波动、功率因数降低、网损增加等问题,无功优化成为保障配电网安全、经济、高效运行的关键技术。 1. 核心目标 电压稳定性:抑制DG并网点(PCC)及敏感节点的电压越限(如超过5%…...

游戏引擎学习第301天:使用精灵边界进行排序

回顾并为今天的内容做准备 昨天,我们解决了一些关于排序的问题,这对我们清理长期存在的Z轴排序问题很有帮助。这个问题我们一直想在开始常规游戏代码之前解决。虽然不确定是否完全解决了问题,但我们提出了一个看起来合理的排序标准。 有两点…...

网络框架二次封装:基于Kotlin的高扩展性网络请求框架完整实现

完整目录结构 1. 架构设计1.1 分层架构1.2 核心组件1.3 接口关系图2. 基础配置实现2.1 NetworkConfig完整代码2.2 CacheConfig完整代码3. 核心网络客户端3.1 SmartHttpClient完整实现3.2 单例管理3.3 服务创建与执行4. DSL请求构建器4.1 NetworkRequest完整实现4.2 生命周期绑…...

高噪声下扩展边缘检测算子对检测边缘的影响

目录 一、常见的边缘检测算子 二、扩展边缘检测算子对检测边缘的影响 三、结论 一、常见的边缘检测算子 Sobel 算子: Prewitt算子;...

Linux 内核音视频架构(V4L2 )介绍

一.概述 Linux 内核中的 V4L2(Video for Linux Two)框架 是用于管理音视频设备(如摄像头、电视调谐器、视频采集卡等)的核心子系统。 它提供了一套统一的接口,使得用户空间应用程序能够方便地访问和控制硬件设备&…...

专业 YouTube SEO 方案:打造高排名视频的关键步骤

YouTube 是全球订阅量最高的社交媒体平台之一。YouTube 为发布创意视频内容和针对特定受众开展营销活动提供了无限可能,是任何品牌内容营销策略的重要组成部分。 但是,为了发展您的 YouTube 频道并消除噪音,优化您的视频内容以便可以在搜索结…...

基于STM32的智能台灯_自动亮度_久坐提醒仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)

这里写目录标题 1.主要功能2.仿真设计3.程序设计4.设计报告5.下载链接 基于STM32的智能台灯_自动亮度_久坐提醒仿真设计 (Proteus仿真程序设计设计报告讲解视频) 仿真图Proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号&#xff1…...

labview硬件部分——压力测量

0kg的电压需要我们手动输入!在不放东西的时候的电压,先运行一次程序,将其记录后写到程序中的0kg输入按键即可。 整体的程序:...

Mysql索引实战1

对于上面这两种 name>‘a’ 和 name>‘zzz’ 的执行结果,mysql最终是否选择走索引或者一张表涉及多个索引,mysql最终如何选择索引,我们可以用trace工具来一查究竟,开启trace工具会影响mysql性能,所以只能临时分析…...

在实际网络部署中,静态路由的优先级通常高于RIP

是的,在实际网络部署中,静态路由的优先级通常高于RIP,尤其是在中小型网络或对可控性要求高的场景中。以下是关键原因和典型应用场景分析: 1. 为何静态路由比RIP更受青睐? (1) 简单性与可靠性 静态路由: 手…...

Linux系统编程-DAY02

一、标准io 1.写文件 fgets函数中判断有多少行,且判断最后一个是不是终止符 if( buf[strlen(buf) - 1] \n ) 2. wc命令行:字符统计 wc -l 文件名 行数 文件名 3. write 用于操作二进制的文件(文办文件和图片文件也可以…...

【C++ 真题】P5736 【深基7.例2】质数筛

P5736 【深基7.例2】质数筛 题目描述 输入 n n n 个不大于 10 5 10^5 105 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 n n n,表示整数个数。 第二行输入 n n n 个正…...

自制操作系统day6(GDTR、段描述符、PIC、实模式和保护模式、16位到32位切换、中断处理程序、idt的设定、EFLAG寄存器)(ai辅助整理)

day6 分割源文件(harib03a) 优点 按照处理内容进行分类,如果分得好的话,将来进行修改时,容易找到地方。如果Makefile写得好,只需要编译修改过的文件,就可以提高make的速度。单个源文件都不长。…...

大模型评测与可解释性

随着大模型在各个领域展现出惊人的能力,我们对其性能的评估和对其决策过程的理解变得尤为重要。一个模型即使在基准测试中表现出色,也可能在实际应用中遇到意想不到的问题。同时,由于大模型的复杂性,它们常常被视为“黑箱”,这给其在关键领域的应用带来了挑战。 本章将深…...

【TTS回顾】StyleTTS 深度剖析:TTS+风格迁移

写在前面 这篇博客我们回顾一下StyleTTS,当时的背景是,文本转语音(TTS)技术,早已不再满足于仅仅将文字转化为可听的语音。行业需要的是“真人TTS”,AI 不仅能“说得清楚”,更能“说得生动”、“说得有感情”,甚至能模仿特定人物的说话风格。富有表现力的语音合成,即能…...

GStreamer (四)交叉编译

交叉编译 下载链接库交叉编译1、下载Gstreamer (方式二 ),进入到编译目录2、在gst-build目录下创建交叉编译配置文件cross_file.txt3、修改meson_options.txt中libmount选项为false,否则编译前需要先编译libmount。4、在gst-build…...

电路设计基础

只有当电容两端的电压等于0伏的时候,就是这一点的电压和这一点电压之间没有压差的时候,我门才可以把电容当成是一根导线,如果当我电容比如说它己经充到有一个1伏的电压了,这个时候我们是不可以把电容当成是导线的,所以…...

C语言——函数递归与迭代

(1)递归的例子: 顺序打印一个整数,打印整数的每一位。 例如: input:1234 output:1 2 3 4 input:520 output:5 2 0 我们可能会想到用这种方法:(但是运行之后,我们发现结果是事…...

详解 C# 中基于发布-订阅模式的 Messenger 消息传递机制:Messenger.Default.Send/Register

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...

8 种快速易用的Python Matplotlib数据可视化方法

你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python 的 Matplotlib 库是你数据可视化的最佳伙伴!它简单易用、功能强大,能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…...

嵌入式开发学习日志(linux系统编程--文件读写函数(2))Day25

一、linux操作命令 【wc】:指定字符统计; 【file 文件名】:可以查看文件的类型; 二、写入函数【fwrite】————可写入二进制文件 形式: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE…...

离线服务器Python环境配置指南

离线服务器Python环境配置指南:避坑与实战 0. 场景分析:当服务器与世隔绝时 典型困境: 无法访问国际网络(如PyPI、Conda官方源)服务器处于内网隔离环境安全策略限制在线安装 解决方案矩阵: 方法适用场…...

Java线程池调优与实践经验

在Java面试中,线程池调优是一个常见且重要的考察点,尤其是当涉及Spring生态时,ThreadPoolTaskExecutor的使用经验通常会被深入追问。以下是针对该问题的结构化回答,结合原理、实践和调优经验: 1. 线程池调优的核心参数…...

Python 包管理工具核心指令uvx解析

uvx 是 Python 包管理工具 uv 的重要组成部分,主要用于在隔离环境中快速运行 Python 命令行工具或脚本,无需永久安装工具包。以下是其核心功能和使用场景的详细解析: 一、uvx 的定位与核心功能 工具执行器的角色 uvx 是 uv tool run 的别名&a…...

力扣-三数之和

1.题目描述 2.题目链接 LCR 007. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 3.题目代码 import java.util.*; class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);int tempnums.length-1;Set<List<Integer>…...

【AI模型学习】ESM2

文章目录 1. 版本2. 开始2.1 安装2.2 使用预训练模型2.2.1 代码2.2.2 讲解 2.2 结构预测 3. 任务类型总结1. 蛋白质结构预测&#xff08;ESMfold&#xff09;2. 特征嵌入提取&#xff08;esm-extract&#xff09;3. 零镜头变体预测&#xff08;ESM-1v/ESM-2&#xff09;4. 逆向…...

c++11特性——可变参数模板及emplace系列接口

文章目录 可变参数模板基本语法和使用sizeof...运算符 从语法角度理解可变参数模板包扩展通过编译时递归解析参数包直接对解析行为展开 emplace系列接口举例讲解emplace_back的实现 可变参数模板 可变参数模板是c11新特性中极其重要的一节。前文我们提到过&#xff0c;c11中对…...

深入理解 Pre-LayerNorm :让 Transformer 训练更稳

摘要 在超深 Transformer 与大语言模型&#xff08;LLM&#xff09;时代&#xff0c;归一化策略直接决定了模型能否稳定收敛、推理性能能否最大化。把归一化层从 “残差之后” 挪到 “子层之前”&#xff08;Pre-LayerNorm&#xff0c;Pre-LN&#xff09;&#xff0c;再将传统…...

vue3:十三、分类管理-表格--分页功能

一、实现效果 实现分页功能,并且可对分页功能和搜索框功能能动态显示 1、显示分页 2、分页功能和搜索栏隐藏 二、基础搭建 1、官网参考 Pagination 分页 | Element Plus 使用分页的附加功能 2、表格中底部写入分页 (1)样式class 在全局js中写入顶部外边距样式margin-t…...

工商总局可视化模版-Echarts的纯HTML源码

概述 基于ECharts的工商总局数据可视化HTML模版&#xff0c;帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范&#xff0c;功能完善&#xff0c;适合各类工商监管场景使用。 主要内容 本套模版采用现代化设计风格&#xff0c;主要包含以下核心功能模块&…...

8.2 线性变换的矩阵

一、线性变换的矩阵 本节将对每个线性变换 T T T 都指定一个矩阵 A A A. 对于一般的列向量&#xff0c;输入 v \boldsymbol v v 在空间 V R n \pmb{\textrm V}\pmb{\textrm R}^n VRn 中&#xff0c;输出 T ( v ) T(\boldsymbol v) T(v) 在空间 W R m \textrm{\pmb W}\…...

工业路由器WiFi6+5G的作用与使用指南,和普通路由器对比

工业路由器的技术优势 在现代工业环境中&#xff0c;网络连接的可靠性与效率直接影响生产效率和数据处理能力。WiFi 6&#xff08;即802.11ax&#xff09;和5G技术的结合&#xff0c;为工业路由器注入了强大的性能&#xff0c;使其成为智能制造、物联网和边缘计算的理想选择。…...

Nginx核心服务

一&#xff0e;正向代理 正向代理&#xff08;Forward Proxy&#xff09;‌是一种位于客户端和原始服务器之间的代理服务器&#xff0c;其主要作用是将客户端的请求转发给目标服务器&#xff0c;并将响应返回给客户端 Nginx 的 正向代理 充当客户端的“中间人”&#xff0c;代…...

条件随机场 (CRF) 原理及其在语义分割中的应用

条件随机场 (CRF) 原理及其在语义分割中的应用 一、条件随机场的原理 条件随机场 (Conditional Random Fields, CRF) 是一种判别式概率无向图模型。它用于在给定观测序列 (如图像中的像素) 的条件下&#xff0c;对另一组序列 (如像素的语义标签) 进行建模和预测。 与生成式模…...

2025年Y2大型游乐设施操作证备考练习题

Y2 大型游乐设施操作证备考练习题 单选题 1、《游乐设施安全技术监察规程&#xff08;试行&#xff09;》规定&#xff1a;对操作控制人员无法观察到游乐设施的运行情况&#xff0c;在可能发生危险的地方应&#xff08; &#xff09;&#xff0c;或者采取其他必要的安全措施。…...

L53.【LeetCode题解】二分法习题集2

目录 1.162. 寻找峰值 分析 代码 提交结果 2.153. 寻找旋转排序数组中的最小值 分析 图像的增长趋势可以分这样几类 逐个击破 比较明显的 先增后减再增 用二段性给出left和right的更新算法 代码 提交结果 其他做法 提交结果 3.LCR 173. 点名(同剑指offer 53:0~…...

趣味编程:抽象图(椭圆组成)

概述&#xff1a;本篇博客主要讲解由椭圆图案组合而成的抽象图形。 1.效果展示 该程序的实际运行是一个动态的效果&#xff0c;因此实际运行相较于博客图片更加灵动。 2.源码展示 // 程序名称&#xff1a;椭圆组合而成的抽象图案// #include <graphics.h> #include <…...

RPA浪潮来袭,职业竞争的新风口已至?

1. RPA职业定义与范畴 1.1 RPA核心概念 RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;是一种通过软件机器人模拟人类操作&#xff0c;实现重复性、规律性任务自动化的技术。它能够自动执行诸如数据输入、文件处理、系统操作等任务&…...

【Elasticsearch】字段别名

在 Elasticsearch 中&#xff0c;字段别名&#xff08;Field Alias&#xff09;主要用于查询和检索阶段&#xff0c;而不是直接用于写入数据。 为什么不能通过字段别名写入数据&#xff1f; 字段别名本质上是一个映射关系&#xff0c;它将别名指向实际的字段。Elasticsearch …...

【Linux笔记】防火墙firewall与相关实验(iptables、firewall-cmd、firewalld)

一、概念 1、防火墙firewall Linux 防火墙用于控制进出系统的网络流量&#xff0c;保护系统免受未授权访问。常见的防火墙工具包括 iptables、nftables、UFW 和 firewalld。 防火墙类型 包过滤防火墙&#xff1a;基于网络层&#xff08;IP、端口、协议&#xff09;过滤流量&a…...

人工智能解析:技术革命下的认知重构

当生成式AI能够自主创作内容、设计方案甚至编写代码时&#xff0c;我们面对的不仅是工具革新&#xff0c;更是一场关于智能本质的认知革命。人工智能解析的核心&#xff0c;在于理解技术如何重塑人类解决问题和创造价值的底层逻辑——这种思维方式的转变&#xff0c;正成为数字…...

Neo4j实现向量检索

最近因为Dify、RagFlow这样的智能体的镜像拉取的速度实在太麻烦&#xff0c;一狠心想实现自己的最简单的RAG。 因为之前图数据库使用到了neo4j&#xff0c;查阅资料才发现​​Neo4j从5.11版本开始支持向量索引&#xff0c;提供一个真实可用的单元测试案例。 Neo4j建向量索引表…...

SpringBoot外部化配置

外部化配置&#xff08;Externalized Configuration&#xff09;是指将应用的配置从代码中剥离出来&#xff0c;放在外部文件或环境中进行管理的一种机制。 通俗地说&#xff0c;就是你不需要在代码里写死配置信息&#xff08;比如数据库账号、端口号、日志级别等&#xff09;…...

Gut(IF: 23.1)|深度多组学破局肝癌免疫联合治疗耐药的空间微环境图谱

肝细胞癌&#xff08;HCC&#xff09;是癌症相关死亡的主要原因之一&#xff0c;晚期患者预后极差。近年来&#xff0c;免疫检查点抑制剂&#xff08;ICI&#xff09;联合治疗&#xff08;如抗CTLA-4的tremelimumab和抗PD-L1的durvalumab&#xff09;已成为晚期HCC的一线治疗方…...

2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展

文章目录 1. 美化 Powershell 缘起2. 安装 oh-my-posh 和 posh-git3. 安装文件夹美化主题【可选】 1. 美化 Powershell 缘起 背景&#xff1a;用了 N 年的 Windows 系统突然觉得命令行实在太难用了&#xff0c;没有补全功能、界面也不美观。所以&#xff0c;我决定改变它。但是…...