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

【每日八股】复习 Redis Day5:集群(上)

文章目录

  • 复习昨日内容
    • 缓存雪崩、击穿、穿透的问题描述及解决方案
    • 如何保证数据库和缓存的一致性
      • 普通方案
      • 进阶方案
    • 如何保证缓存删除一定成功?
    • 针对业务一致性要求高的场景,如何确保缓存与数据库的一致性?
    • 如何避免缓存失效?
    • 如何实现延迟队列?
    • 设计一个缓存策略,以动态缓存热点数据?
    • Redis 实现分布式锁?
    • Redis 如何解决集群模式下的分布式锁可靠性?
    • Redis 管道的作用?管道与事务有什么区别?
    • 介绍一个 Redis 的线程模型
      • 简述一下 I/O 多路复用机制
  • 复习 Redis Day5:集群
    • Redis 集群模式有哪些?
    • Redis 切片集群的工作原理
    • 哈希槽与 Redis 节点如何对应?
    • 主从模式的同步过程?

复习昨日内容

缓存雪崩、击穿、穿透的问题描述及解决方案

缓存雪崩
大量热点数据同时过期,或缓存宕机,此时恰逢大量请求访问缓存,在缓存查不到就去查数据库,导致数据库压力骤增,最终服务崩溃。

缓存雪崩的解决方案是:均匀设置热点数据的过期时间、缓存宕机时触发熔断降级停止服务、客户端请求访问数据库重建缓存时加互斥锁。

缓存击穿
当前客户端频繁请求访问的热点数据过期了,导致客户端请求直接穿过缓存访问数据库,导致数据库压力骤增,服务崩溃。

缓存击穿的解决方案是:不为热点数据设置过期时间,或是热点数据过期后当有请求访问数据库重建缓存时加互斥锁。

缓存穿透
大量恶意的用户请求访问缓存和数据库中不存在的数据,占用资源。

缓存穿透的解决办法是:在缓存中设置一个默认值或零值、将频繁恶意访问的用户拉入黑名单。

如何保证数据库和缓存的一致性

普通方案

  • Cache-Aside(旁路缓存):客户端请求访问缓存时,如果能查到数据就直接返回结果,否则查数据库并将结果放回缓存;客户端请求需要修改数据库时,先修改数据库,再删除缓存,写操作不会主动将数据库中修改的结果放回缓存,而是先修改数据库,再删除缓存(这种方式不可避免地会产生缓存中短暂地存在脏数据的问题,当写请求修改数据库时,并发的读请求可以读取到缓存删除前的旧数据)。
  • Read/Write Through:依赖于缓存的组件,比如 Redis 企业版。针对读操作,如果缓存命中则直接返回数据,如果缓存未命中则依赖于缓存组件查数据库并返回结果,在此期间会将数据同步到缓存;针对写操作,直接修改缓存,缓存组件会将修改的结果同步到数据库。
  • Write Behind:写操作会直接修改缓存,再由缓存自行异步地将数据同步到数据库。这种方式的速度很快,但是可能导致数据不一致的问题,适用于允许数据丢失的高并发场景。

进阶方案

双删策略 + 延迟消息
针对写操作,系统首先删除缓存,再向 MQ 发送一条延迟消息,然后系统到数据库当中修改数据库。延迟消息到期时,再次删除缓存。双删策略可以避免修改数据库时的并发读导致的脏数据缓存重建。

基于 binlog 的最终一致性方案

  1. 主库执行写操作,自动生成 binlog;
  2. 数据库的中间件(如 Canal)持续抓取 binlog;
  3. 将 binlog 的二进制日志翻译为可读事件;
  4. 通过 MQ 将事件广播到包括缓存在内的所有订阅方;
  5. 各系统(如缓存/搜索/统计)按顺序消费事件,但允许处理速度不同。

如何保证缓存删除一定成功?

重试机制
引入消息队列,将删除缓存操作封装为消息事件,使用支持持久化的消息队列来存储事件,将事件交由消费者来完成缓存删除。引入消息队列并将删除操作封装为消息事件之后,即使消费者崩溃,消息也不会丢失。

基于 binlog 的最终一致性
所有删除操作先记录到 binlog 日志,后台进程持续消费日志进行删除,定期检查日志和缓存状态。

针对业务一致性要求高的场景,如何确保缓存与数据库的一致性?

  • 旁路缓存或 Read/Write Through;
  • 延迟双删;
  • 基于 binlog 的最终一致性;
  • 旁路缓存优化:写操作前获取分布式锁,更新数据库并删除缓存后释放锁。缺点在于引入分布式锁会牺牲一定的并发性。

如何避免缓存失效?

业务上线之前进行「缓存预热」,提前将数据库中的数据加载到缓存当中。

业务上线之后,可以开一个后台线程不断检查缓存是否失效,如果检测到缓存失效,该线程就去数据库查数据并放回缓存。

或者当业务线程发现缓存失效之后,通过 MQ 发送消息给后台线程更新缓存,后台线程收到消息后,在更新缓存之前会检查缓存是否存在,如果存在就不执行放回操作,否则查数据库将数据放回缓存。

如何实现延迟队列?

通过 Redis 的 ZSET 可以实现延迟队列。ZSet 有一个 Score 属性存储延迟执行的事件。使用 zadd score1 value1 可以新建延迟事件,再通过 zrangebyscore 可以符合条件的待处理任务。

设计一个缓存策略,以动态缓存热点数据?

通过 Redis 的 ZSET 数据结构来实现,可以通过数据的最新访问时间来对数据进行排名,当有新的请求访问数据,就为该数据增加相应的分数,通过 zrangebyscore 返回基于分数排序的结果。

Redis 实现分布式锁?

Redis 可以通过一个全局可见的共享内存来实现跨进程/节点的分布式锁。具体来说,通过命令 SET key unique_value NX PX timeout 命令来完成。NX 确保仅当 key 不存在时设置成功,PXtimeout 为锁设置了过期时间,unique_value 是唯一标识(如 UUID),确保只有锁的持有者能够释放锁。

避免死锁
加锁时通过设置 NX 字段确保只有 key 不存在时才能过加锁。

如何防止其他客户端误删当前客户端的锁?
在删除锁时需要通过 unique_value 进行校验。通过 lua 脚本确保检验操作与锁删除操作的原子性。

锁超时和业务执行时间冲突怎么办?
可以引入锁续期机制(Watchdog),客户端获取锁后,会启动一个后台线程,定期检查锁是否被持有。

Redis 的单点故障问题?
指的是 Redis 宕机时,锁丢失会导致多个客户端同时持有分布式锁,破坏互斥性。

解决办法是引入 RedLock 算法,具体来说是客户端申请加分布式锁时需要同时向多个 Redis 主节点请求加锁,多数节点同意才算加锁成功。如果失败,则向所有节点发送释放锁请求。

高并发下如何处理锁竞争?

  1. 减小锁的粒度,在业务维度细分;
  2. 等待队列;
  3. 超时与重试机制;

为什么选 Redis 实现分布式锁,而不是 zookeeper 或 etcd?

  • Redis 的优势:性能高,实现简单,社区成熟;
  • Zookeeper / etcd 的优势:高一致性,但是性能较低,需要维护临时会话。

Redis 如何解决集群模式下的分布式锁可靠性?

通过 RedLock 算法。

具体的加锁步骤如下:

  1. 客户端获取当前时间( t 1 t_1 t1);
  2. 客户端同时向多个 Redis 主节点发送加锁请求;
  3. 一旦超过半数 Redis 主节点同意加锁,则加锁成功,记录当前时间( t 2 t_2 t2);
  4. 计算总时耗 t 2 − t 1 t_2 - t_1 t2t1,如果总时耗小于锁的过期时间,则认为客户端加锁成功,否则加锁失败,加锁失败时需要向所有 Redis 主节点发送锁删除请求,通过 lua 脚本确保锁校验与锁删除的原子性。

Redis 管道的作用?管道与事务有什么区别?

Pipeline

  • 用于优化网络性能:客户端将 Redis 操作写入 Pipeline 打包发送给 Redis,Redis 处理完之后将处理结果一并返回给客户端,批量操作减少了端到端传输在网络中的 RTT;
  • 非原子性:管道中的命令顺序执行,一条失败不会影响其他命令,执行期间其他客户端的命令可以插入。

Transaction

  • 通过 MULTIEXEC 将多个命令打包为原子性操作;
  • 通过 WATCH 实现乐观锁;
  • 事务中如果存在语法错误会导致事务执行失败;
  • 事务执行之后,如果存在某条命令执行失败,不会影响后续命令的执行,因此 Redis Transaction 不具有原子性和回滚机制。
  • Lua 脚本具有原子性,支持事务回滚,因此应该优先使用 Lua 脚本。

Redis 事务的乐观锁
主要用途

  1. 并发控制:允许客户端在执行事务前监视一个或多个键,如果这些键在事务执行之前被修改,那么事务执行失败;
  2. CAS(Check-And-Set)操作:假设冲突不发生,只在提交时检查数据是否被修改。

介绍一个 Redis 的线程模型

Redis 6.0 之前,Redis 使用单线程来处理所有的任务,包括连接请求、网络 I/O 以及实际的命令执行。Redis 6.0 之后引入了多线程来辅助网络 I/O,但 Redis 的命令执行仍然是单线程执行。

具体来说,Redis 内部使用一个「文件事件处理器」来监控并处理所有请求,它是单线程的,因此 Redis 也是单线程的。文件事件处理器采用 I/O 多路复用机制来监听多个 event,将产生事件的 socket 压入内存队列当中,事件分派器会将 socket 根据事件类型派发给具体的事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)处理具体的事件。

简述一下 I/O 多路复用机制

I/O 多路复用是一种高效的 I/O 处理机制,它允许单个进程/线程同时监视多个文件描述符(如 socket),并在任何一个或多个文件描述符就绪时得到通知。

核心思想是:

  • 单线程处理多连接:用一个线程管理多个 I/O 流,避免为每个连接创建线程的开销;
  • 非阻塞 + 就绪通知:将文件描述符设为非阻塞模式,当某个描述符就绪时得到通知;
  • 避免忙等:通过系统调用阻塞等待,直到有描述符就绪。

实际上 I/O 多路复用机制与 Golang 当中的「select」机制非常像。

复习 Redis Day5:集群

在这里插入图片描述

Redis 集群模式有哪些?

主从:选择一台主服务器,将数据同步到多台从服务器,以构建一主多从模式,主从之间读写分离。主服务器可读可写,从服务器一般只读。主从服务器之间的命令复制是异步的,因此无法保证强一致性。需要注意的是,Redis 的主从复制模式不局限于“一主多从”结构,可能的配置包括:

  • 标准一主多从:一个主节点(Master)+ 多个从节点(Slave);
  • 级联复制(主-从-从):复制的顺序为 主节点 -> 从节点1 -> 从节点2,可以减轻主节点的复制压力;
  • 多主节点架构:通过 Redis Sentinel 或 Cluster 实现多主节点,每个主节点有自己的从节点,数据分片存储在不同的主节点当中。

哨兵:当 Redis 主从服务器出现故障宕机时,需要手动恢复,哨兵模式(Redis Sentinel)解决了这个问题,Redis Sentinel 是 Redis 官方提供的高可用性(HA)方案,用于管理 Redis 主从集群,实现自动故障检测和故障转移。Redis Sentinel 的核心功能包括:

  1. 监控:持续检查主从节点是否正常运行;
  2. 通知:当被监控的 Redis 节点出现问题时,可以通过 API 通知管理员;
  3. 自动故障转移:主节点故障时,自动将一个从节点升级为新的主节点;
  4. 配置提供:作为客户端服务的发现源,提供当前可用的主节点地址。

Redis Sentinel 节点本身是一个特殊的 Redis 实例,一个 Sentinel 集群需要三个或以上的 Sentinel 节点,使用 Raft 算法实现 Sentinel 节点之间的共识。

Sentinel 集群当中包含至少 1 个主节点和 1 个或多个从节点。

切片集群:当数据量大到一台服务器不能承载时,需要使用 Redis 切片集群(Redis Cluster)方案,它将数据分布到不同的服务器上,以此来降低系统对单主节点的依赖,提高 Redis 服务的读写性能

Redis 切片集群的工作原理

切片集群采用哈希槽来进行数据和节点的映射,一个切片集群一共有 16384 个操作,每个存储数据的 key 会经过运算映射到 16384 个槽位中,映射关系如下:

  • 由 key 通过 CRC 16 算法计算出一个 16 bit 的数字;
  • 根据得到的数字,对 16384 取模,确定对应的哈希槽。

「注意」:Redis 的所有键是二进制安全的字符串(可以包含任何数据,比如文本、序列化对象),CRC16 算法的输入是任意长度的字符串,输出是固定的 16 位无符号整数,相同的字符串永远得到相同结果,不同字符串会均匀分布在输出空间。16384 恰位 65536 的 1 4 1 \over 4 41

哈希槽与 Redis 节点如何对应?

  • 平均分配:集群创建时,Redis 自动将哈希槽平均分到集群节点上。
  • 手动分配:使用命令指定没个节点上的哈希槽数目。

主从模式的同步过程?

一. 同步建立阶段

  1. 从节点执行命令连接到主节点;
  2. 从节点保存主节点信息到自己的内存;
  3. 建立与主节点的 socket 连接。

如果需要进行身份验证,那么从节点会向主节点发送 AUTH 命令,验证成功后继续后续流程。

二. 全量同步(初次同步)
首先,从节点向主节点发送 PSYNC ? -1 命令,表示初次同步。之后主节点返回 FULLRESYNC <runid> <offset> 响应:

  • runid:主节点的唯一 ID;
  • offset:当前复制偏移量。

然后:

  1. 主节点执行 bgsave 生成 RDB 快照;
  2. 生成期间的新命令存入复制缓冲区(replication buffer);
  3. RDB 通过 socket 传输到从节点;
  4. 从节点清空旧数据,加载 RDB 文件;
  5. 主节点将复制缓冲区当中的写命令发送给从节点,从节点执行这些命令以同步主节点状态。

三. 增量同步(断线重连)
首先进行条件检查,从节点需满足:

  • 主节点 runid 未变化;
  • 从节点 offset 仍在主节点的复制积压缓冲区中。

之后:

  1. 从节点发送 PSYNC <runid> <offset>
  2. 主节点返回 CONTINUE 响应;
  3. 主节点发送从 offset 之后的所有写命令。

四. 持续同步阶段
命令传播:主节点每执行一个写命令

  • 就将命令发送给所有从节点;
  • 自身和从节点的 offset 增加;

心跳检测

  • 主从节点默认每隔一段时间(比如 10 秒)互相发送 PING;
  • 从节点每秒上报自身复制的 offset。

相关文章:

【每日八股】复习 Redis Day5:集群(上)

文章目录 复习昨日内容缓存雪崩、击穿、穿透的问题描述及解决方案如何保证数据库和缓存的一致性普通方案进阶方案 如何保证缓存删除一定成功&#xff1f;针对业务一致性要求高的场景&#xff0c;如何确保缓存与数据库的一致性&#xff1f;如何避免缓存失效&#xff1f;如何实现…...

linux进程的复制和替换

Linux 进程的复制与替换 一、主函数参数 在 C 语言里&#xff0c;main 函数能够接收参数&#xff0c;其标准形式如下&#xff1a; int main(int argc, char* argv[], char* envp[]);argc&#xff1a;代表命令行参数的数量&#xff0c;为整数类型。argv&#xff1a;是一个字符…...

【质量管理】现代TRIZ问题识别中的功能分析——相互接触分析

在文章【质量管理】现代TRIZ中问题识别中的功能分析——组件分析-CSDN博客中我们知道了如何对产品进行组件分析&#xff0c;那么组件分析出来有什么作用呢&#xff1f;组件分析就是为了接下来相互接触分析使用的。 什么是相互接触 相互接触分析是功能分析的一部分&#xff0c;…...

一种快速计算OTA PSRR的方法(Ⅱ)

1.仿真验证 1.1仿真设置 1.1.1 Test-bench原理 1.1.2 管子参数设置 为了公平地比较性能&#xff0c;设置所有OTA 的输入晶体管M1和M2为相同的gm和偏置电流1uA。 具体晶体管宽长比设置参见5.参考资料中的论文2。 1.2仿真验证 1.2.1 CM OTA 1&#xff09;小信号参数 M1 M…...

【C++】通过红黑树封装map和set

前言&#xff1a; 通过之前的学习&#xff0c;我们已经学会了红黑树和map、set。这次我们要实现自己的map和set&#xff0c;对&#xff0c;使用红黑树进行封装&#xff01; 当然&#xff0c;红黑树内容这里就不在赘述&#xff0c;我们会复用红黑树的代码&#xff0c;所以先将…...

【Java IO流】字节输入流FileInputStream、字节输出流FileOutputStream

目录 0.前言 1.FileInputStream 1.1 概述 1.2 构造方法 1.3 成员方法 1.4 FileInputStream读取文件案例演示 2.FileOutputStream 2.1 概述 2.2 构造方法 2.3 成员方法 2.4 写入文本文件案例演示 3.FileInputStream FileOutputStream拷贝文件 0.前言 本文讲解的是…...

信息收集新利器:SSearch Chrome 插件来了

SSearch 下载地址 SSearch &#x1f623;用途 每次谷歌语法搜索时还得自己写&#xff0c;我想省事一点&#xff0c;弄了一个插件&#xff0c;先加了几个常用的语法&#xff0c;点击后会跳转到对应搜索页面&#xff0c;也可以直接在搜索框微调 后续也会加些其他语法 &#…...

【AI面试准备】AI误判案例知识库优化方案

面试题&#xff1a;建立内部知识库&#xff1a;收集AI误判案例训练领域专属模型。 在回答关于“建立内部知识库收集AI误判案例训练领域专属模型”的面试问题时&#xff0c;建议从以下结构化框架展开&#xff0c;既能体现专业性&#xff0c;又能展现解决问题的系统性和实际落地…...

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

一、前言 在之前的系列文章中&#xff0c;我们已经讨论过了MIG ip的接口内容&#xff0c;配置方式和modelsim独立仿真相关的内容&#xff0c;因此&#xff0c;本文对于之前已经讨论过的相关内容只做简单描述&#xff0c;着重介绍AXI 接口MIG使用上与普通ui接口的不同之处。感兴…...

字符和编码(python)

位数&#xff1a;英文字符使用 1 个字节表示&#xff0c;中文字符通常使用 3 个字节。示例&#xff1a;汉字 “汉” 的 UTF-8 编码是 \xE6\xB1\x89。优点&#xff1a;兼容 ASCII&#xff0c;广泛用于网络传输和文件存储。 Python 中的字符串类型 在 Python 中&#xff0c;字…...

【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记 一、什么是输入捕获&#xff08;Input Capture&#xff09; 输入捕获是利用定时器的输入通道&#xff0c;在检测到信号电平变化&#xff08;如上升沿或下降沿&#xff09;时&#xff0c;立即将当前计数器的值捕获并保存到捕获寄存器&#xff08…...

spring-ai集成langfuse

1、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…...

SALOME源码分析: ParaVis

本文分析SALOME中ParaVis模块。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。注2&#xff1a;文章内容会不定期更新。 一、核心组件 二、关键流程 三、FAQs 网络资料 SALOME Scientific visualisationPARAVIS Module - Architecture …...

Ubuntu 安装 MySQL8

在 Ubuntu 下安装 MySQL 服务&#xff0c;推荐使用 apt install 官方的 APT 仓库安装方式&#xff0c;这种方式最安全、最稳定、能自动处理依赖关系&#xff0c;也支持后续升级。不推荐在官网手动下载 .deb 包的方式。 配置 Ubuntu 服务器 1. 确认 Ubuntu 系统版本 使用如下命…...

MATLAB图像加密案例

下面是一个使用 MATLAB 编写的简单图像块置乱加密/解密程序,主要利用了函数来组织代码。 这个程序通过将图像分割成小块,然后根据一个密钥(用于随机数生成器种子)打乱这些块的顺序来实现加密。解密过程则使用相同的密钥恢复原始块顺序。 核心思想: 分块: 将图像划分为 …...

同构字符串(简单)

新建两个哈希表&#xff0c;构建s到t中的字母的映射以及t到s中的字母的映射。 class Solution {public boolean isIsomorphic(String s, String t) {Map<Character,Character> s2tnew HashMap<Character,Character>();Map<Character,Character> t2snew Hash…...

红米Note9 4G版拆开后盖操作细节

先把sim卡槽整个拔出 然后如下图做试&#xff0c;4个箭头的位置塞塑料片或者指甲插入&#xff0c;弄开&#xff0c;然后从图中右侧抠开&#xff08;左侧不行&#xff0c;有排线连着后面手机主板&#xff09; 如果不按照这种办法&#xff0c;会把后盖很多地方抠烂...

Qt通过QXlsx库文件写入到excl文件,读取excl文件

第一&#xff1a;下载QXlsx库文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt项目中引入QXlsx库&#xff0c;需要把QXlsx库文件放在项目文件夹下 第三&#xff1a;将tableview中的数据存入到excl文件 代码&#xff1a; void MainWindow…...

ESP32 在Platform Arduino平台驱动外部PSAM,进行内存管理

一&#xff0c;基本介绍 本文中主要介绍ESP32、ESP32S3系列单片机&#xff0c;基于Vscode Platform Arduino和Arduino框架下如何使用外部PSAM&#xff0c;以及必要的API调用函数进行内存分配和管理。 使用前提是开发板有外部PSRAM。 二&#xff0c;平台配置 2.1 Arduino平台 …...

【AI论文】WebThinker:赋予大型推理模型深度研究能力

摘要&#xff1a;大型推理模型&#xff08;LRMs&#xff09;&#xff0c;如OpenAI-o1和DeepSeek-R1&#xff0c;展示了令人印象深刻的长期推理能力。 然而&#xff0c;他们对静态内部知识的依赖限制了他们在复杂的知识密集型任务上的表现&#xff0c;并阻碍了他们生成需要综合各…...

Python爬虫基础总结

Python爬虫基础总结 一、爬虫概述 1.1 什么是爬虫 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动浏览万维网的程序或脚本&#xff0c;它按照一定的规则&#xff0c;自动抓取互联网上的信息并存储到本地数据库中。 1.2 爬虫工作流程 ​​URL管理器​​&#xff1…...

如何构建跨平台可复用的业务逻辑层(Web、App、小程序)

从传统的Web应用到移动端的App&#xff0c;再到近年来快速崛起的小程序&#xff0c;用户的触点变得异常分散且多样化。这种多端并存的现状一方面为企业提供了更广阔的市场机会&#xff0c;另一方面也对开发团队提出了更高的要求&#xff1a;如何在不同平台间实现高效开发、降低…...

本地大模型编程实战(32)用websocket显示大模型的流式输出

在与 LLM(大语言模型) 对话时&#xff0c;如果每次都等 LLM 处理完毕再返回给客户端&#xff0c;会显得比较卡顿&#xff0c;不友好。如何能够像主流的AI平台那样&#xff1a;可以一点一点吐出字符呢&#xff1f; 本文将模仿后端流式输出文字&#xff0c;前端一块一块的显示文字…...

MySQL数据库上篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月初五 笔者好久没有更新。今天来写一下MySQL数据库的内容还是老样子分为上中下三篇来写&#xff0c;话不多说咱们直接进入正题。 什么是数据库 数据库是统一管理的、长期储存在计算机内非仍、有组织的相关数据集合…...

Webug4.0靶场通关笔记13- 第22关越权修改密码

目录 第22关 越权修改密码 1.打开靶场 2.源码分析 3.越权修改密码 &#xff08;1&#xff09;获取渗透账号 &#xff08;2&#xff09;越权修改aaaaa账号的密码 &#xff08;3&#xff09;修改aaaaa用户密码渗透成功 &#xff08;4&#xff09;水平越权修改mooyuan账号…...

Python 基于 lstm,cnn 算法的网络舆情可视化系统

大家好&#xff0c;我是Python徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕…...

【免费】2007-2021年上市公司对外投资数据

2007-2021年上市公司对外投资数据 1、时间&#xff1a;2007-2021年 2、指标&#xff1a;股票代码、统计截止日期、货币编码、货币类型、投资事件类型编码、投资事件类型、报告期末投资金额总计、占报告期对外投资总额的比例(%) 3、范围&#xff1a;上市公司 4、来源&#x…...

每天学一个 Linux 命令(33):uniq

每天学一个 Linux 命令(33):uniq 命令简介 uniq 是 Linux 系统中一个非常实用的文本处理命令,全称为 “unique”。它主要用于从已排序的文本文件中检测、过滤或统计重复的行。该命令通常与 sort 命令配合使用,是 Shell 脚本编程和日常文本处理中的常用工具之一。 命令语…...

WebRtc11:SDP详解

SDP规范 会话层&#xff08;全局&#xff09;媒体层&#xff08;局部&#xff09; 会话层 会话的名称和目的会话的存活时间会话中包含多个媒体信息 SDP媒体信息 媒体格式传输协议传输IP和端口媒体负载类型 SDP格式 由多个< type > < value > 组成一个会话级…...

51单片机驱动 矩阵键盘

连接方式为8-1顺序连接P1端口P10-P17&#xff0c;代码返回键值 0-15. // 矩阵键盘扫描 uchar key_scan(void) {u8 key_value 255;u8 row, col;// 设置P1.0-P1.3为输出&#xff0c;P1.4-P1.7为输入P1 0xF0; // 1111 0000if((P1 & 0xF0) ! 0xF0) { // 有按键按下delay_m…...

解决The‘InnoDB’feature is disabled; you need MySQL built with ‘InnoDB’ to have it

出现如下语句&#xff1a;The ‘InnoDB feature is disabled; you need MySQL built with ‘InnoDB to have it working&#xff1b; 是mysql配置文件禁掉了这个选项&#xff01; 关闭mysql数据库 在mysql的安装目录中找到my.ini文件 找到skip-innodb&#xff0c;在前面加上#号…...

大模型压缩技术详解(2025最新进展)

在2025年的AI技术格局中&#xff0c;像DeepSeek这样的顶尖模型开源已成为现实。那是否存在一种可行路径&#xff0c;让企业能够使用专注于自身领域的强力AI模型&#xff0c;同时大幅降低部署成本&#xff0c;仅需一张普通的4090显卡&#xff1f;本文将深入探讨两种主流的模型压…...

第 5 篇:红黑树:工程实践中的平衡大师

上一篇我们探讨了为何有序表需要“平衡”机制来保证 O(log N) 的稳定性能。现在&#xff0c;我们要认识一位在实际工程中应用最广泛、久经考验的“平衡大师”——红黑树 (Red-Black Tree)。 如果你用过 Java 的 TreeMap​ 或 TreeSet​&#xff0c;或者 C STL 中的 map​ 或 s…...

spring-- 事务失效原因及多线程事务失效解决方案

事务失效原因 类的自调用&#xff1a;直接调用本类的方法&#xff0c;没有通过代理对象来调用方法&#xff0c;代理对象内部的事务拦截器不会拦截到这次行为。则不可能开启事务 使用私有方法&#xff1a;因为spring的事务管理是基于AOP实现的&#xff0c;AOP代理无法拦截目标对…...

MLPerf基准测试工具链定制开发指南:构建领域特异性评估指标的实践方法

引言&#xff1a;基准测试的领域适配困局 MLPerf作为机器学习性能评估的"黄金标准"&#xff0c;其通用基准集在实际科研中常面临‌领域适配鸿沟‌&#xff1a;医疗影像任务的Dice系数缺失、NLP场景的困惑度指标偏差等问题普遍存在。本文通过逆向工程MLPerf v3.1工具…...

深度理解linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…...

【凑修电脑的小记录】vscode打不开

想把vscode的数据和环境从c盘移到d盘 大概操作和这篇里差不多 修改『Visual Studio Code&#xff08;VS Code&#xff09;』插件默认安装路径的方法 - 且行且思 - 博客园 在原地址保留了个指向新地址的链接文件。 重新安装vscode后双击 管理员身份运行均无法打开&#xff0…...

2025五一数学建模竞赛A题完整分析论文(共45页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛A题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1参考代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 …...

从0搭建Transformer

0. 架构总览&#xff1a; 1. 位置编码模块&#xff1a; import torch import torch.nn as nn import mathclass PositonalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdrop…...

生物化学笔记:神经生物学概论07 躯体感受器 传入方式 自主神经系统

功能各异的躯体感受器 解释张力&#xff1a; 形形色色的传入方式 脑中的“倒立小人” 自主神经系统...

滑动窗口leetcode 209和76

一、leetcode 209. 长度最小的子数组 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int left 0;int sum 0;int res 100001;for(int right 0;right <n;right){sum nums[right];while(s…...

FPGA:介绍几款高速ADC及其接口形式

本文介绍了几款采样率至少为500Msps的高速ADC芯片&#xff0c;并详细介绍ADC与FPGA之间的常见接口形式&#xff0c;以及FPGA如何正确读取高速ADC的输出数据。以下内容基于当前的高速ADC技术趋势和常见的工程实践。 一、推荐的高速ADC芯片&#xff08;采样率≥500Msps&#xff0…...

未使用连接池或配置不当的性能陷阱与优化实践

目录 前言一、传统连接管理的性能缺陷与风险1. 未使用连接池的致命代价2. 连接池配置不当的典型表现 二、高性能连接池选型与核心参数优化1. HikariCP&#xff1a;零开销连接池的标杆2. Druid&#xff1a;功能完备的国产连接池 三、连接池性能调优的黄金法则1. 科学设定最大连接…...

亚马逊云服务器性能深度优化方案(2025版)

亚马逊云服务器性能深度优化方案&#xff08;2025版&#xff09; 一、计算架构全面升级 1. 新一代AI算力引擎 • Trn2 UltraServer实例&#xff1a;搭载64颗第二代Trainium芯片&#xff0c;单节点FP8算力达83.2 PFlops&#xff0c;支持千亿参数大模型训练&#xff0c;训…...

【IPMV】图像处理与机器视觉:Lec9 Laplace Blending 拉普拉斯混合

【IPMV】图像处理与机器视觉 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid Lec9 Laplace Blending 持续更新中 …...

【东枫电子】AMD / Xilinx Alveo™ UL3422 加速器

AMD / Xilinx Alveo™ UL3422 加速器 AMD / Xilinx Alveo™ UL3422 加速器提供超低延迟网络和灵活应变的硬件&#xff0c;支持纳秒级交易策略。AMD Virtex™ UltraScale™ VU2P FPGA 为 AMD / Xilinx Alveo UL3422 加速器提供强大的支持。该加速器采用延迟优化的收发器技术&am…...

Linux架构篇、第一章_03安装部署nginx

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;安装部署nginx 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.02 适用环境: Centos7 文档说明 本文档聚焦于 CentOS 7 环境下 Nginx 的安装部…...

Semantic Kernel 快速入门

文章目录 Semantic Kernel 快速入门一、什么是 Semantic Kernel&#xff1f;1.1 核心特性 二、安装和配置2.1 安装 .NET SDK2.2 创建新的 .NET 项目2.3 安装 Semantic Kernel 三、快速入门3.1 导入依赖包3.2 添加 AI 服务3.3 添加企业服务3.4 生成内核并检索服务3.5 添加插件创…...

MySQL进阶(一)

一、存储引擎 1. MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层&#xff1a; 第二层架构主要完成大多数的核心服务…...

ThreadLocal理解

1.thread是线程&#xff0c;threadLocal是对象&#xff1f; 在 Java 中&#xff1a; Thread 是线程类&#xff0c;其实例代表线程&#xff1a;Thread 类用于创建和管理线程&#xff0c;每个线程都是 Thread 类的一个实例&#xff0c;用于执行具体的任务&#xff0c;例如&…...