缓存 --- Redis缓存的一致性

缓存 --- Redis缓存的一致性

    • 核心问题:更新数据库与缓存的顺序抉择
    • 方案一:直接更新缓存(不推荐)
    • 方案二:删除缓存(让缓存失效,推荐)
    • 进阶优化:解决极端场景下的一致性问题
    • 各策略对比总结
    • 面试应答指南
    • 总结

缓存一致性(Cache Consistency)是分布式系统与高并发架构中的经典核心问题,其核心目标是保证缓存(数据副本)与数据库(真实数据源)的数据同步。在实际业务场景中,强一致性会显著牺牲系统性能,因此绝大多数互联网业务优先追求最终一致性——即允许短期内数据存在不一致,但经过合理时间后,数据能自动恢复同步。

本文将系统拆解缓存一致性的核心策略,重点分析“更新数据库与缓存的顺序抉择”问题,对比各方案的优劣,提供工程化优化方案及可运行代码示例,并整理面试应答指南,为分布式系统开发与架构设计提供实践参考。

核心问题:更新数据库与缓存的顺序抉择

当数据发生变更时,协调数据库与缓存的更新顺序是保证一致性的关键。业界主流方案分为两类:直接更新缓存删除缓存(让缓存失效)。其中,直接更新缓存因性能缺陷极少被采用,我们先对两类方案逐一拆解分析。

方案一:直接更新缓存(不推荐)

直接更新缓存的核心思路是:数据变更时,同时修改数据库和缓存。该方案存在严重的性能浪费问题,仅作原理分析,不建议生产环境使用。

  • 先更新数据库,再更新缓存

流程:Update DB → Update Cache

核心缺点

  • 无效写浪费性能:若数据频繁修改但极少读取,多次更新缓存属于无效操作,徒增系统开销(如高频更新的后台统计数据,若缓存更新后无读请求,则全为无效写);

  • 并发写覆盖:多线程并发更新时,可能出现“数据库是新值,缓存是旧值”的脏数据。例如:线程A更新数据库 → 线程B更新数据库 → 线程B更新缓存 → 线程A更新缓存,最终缓存留存线程A的旧值。

  • 先更新缓存,再更新数据库

流程:Update Cache → Update DB

核心缺点

  • 数据不一致风险:若缓存更新成功,但数据库更新失败(如断电、网络异常、事务回滚),会导致缓存存在“幽灵数据”(数据库中不存在的值),且该数据会长期留存至缓存过期;

  • 同样存在“无效写”问题,性能开销大。

结论:直接更新缓存的方案因性能浪费和一致性风险,已被业界淘汰。推荐采用「Cache Aside Pattern(旁路缓存模式)」:更新时只操作数据库,读取时再从数据库加载最新数据到缓存,通过“读时填充”保证缓存数据的有效性。

方案二:删除缓存(让缓存失效,推荐)

删除缓存的核心思路是:数据变更时,仅更新数据库,同时删除缓存中的旧数据。等待下一次读请求时,发现缓存为空,再从数据库加载最新数据到缓存,以此保证最终一致性。该方案是业界主流,关键在于抉择“删除缓存”与“更新数据库”的顺序。

  • 先删除缓存,再更新数据库

流程:Del Cache → Update DB

核心问题:高并发下极易产生永久性脏数据

该策略的隐患在单线程/低并发场景下难以暴露,但在高并发(同时存在更新请求和读请求)场景下,会大概率出现时序错乱,产生永久性脏数据,具体时序拆解如下:

  1. 线程A(更新请求):发起数据更新,成功删除缓存中的旧数据;

  2. 线程B(读请求):几乎同时发起数据查询,发现缓存为空,随即去数据库读取「旧值」(此时线程A还未完成数据库更新,数据库中仍是旧数据);

  3. 线程B(读请求):将从数据库读取到的「旧值」回填到缓存中(此时缓存中被写入了过期的旧数据);

  4. 线程A(更新请求):完成数据库的更新操作,将「新值」写入数据库。

问题本质与后果

  • 时间窗口宽:删除缓存与更新数据库之间存在“数据库事务执行时间”的宽窗口,高并发下读请求极易插队;

  • 永久性脏数据:缓存中的旧值一旦被回填,会长期留存至缓存过期或下一次更新,期间所有读请求都会获取脏数据,且无自动修正机制,影响周期长。

  • 先更新数据库,再删除缓存(首选基础方案)

流程:Update DB → Del Cache

核心优势

  • 安全性高:即使删除缓存失败,数据库已存储新值。待缓存过期后,下一次读请求会加载新值,仅存在短暂不一致;

  • 性能友好:无无效写操作,删除缓存(如Redis的DEL指令)是轻量级内存操作,开销极低。

潜在风险:极端并发下的临时脏数据

有观点会疑问:“先更新数据库再删除缓存,不也会出现脏数据长期留存的情况吗?比如线程B最终把旧值写入缓存后,不也会直到缓存过期才恢复正常?” 这个疑问很关键,我们需要明确:该方案即使产生脏数据,也属于「极低概率的临时脏数据」,与“先删除缓存再更新数据库”的「高概率永久性脏数据」有本质区别。

首先要承认:若不加任何处理,理论上该方案确实可能导致脏数据长期留存。但核心差异在于「脏数据产生的概率和触发条件」——前者几乎必然发生,后者极端苛刻。下面通过时序对比拆解这个关键差别:

该方案的脏数据仅在「极端苛刻的时序条件」下才会产生,实际发生概率极低。具体时序如下:

  1. 缓存刚好过期(或被删除);

  2. 线程B(读请求):发起查询,发现缓存为空,进入数据库读取旧值(耗时T);

  3. 线程A(写请求):完成数据库更新(耗时T),并删除缓存(耗时T);

  4. 线程B(读请求):将刚才读取的旧值写入缓存。

问题本质与后果:为何是“临时”且“低概率”?

  • 触发条件苛刻:仅当“读库时间T > 写库时间T + 删除缓存时间T”时才会发生。写库通常包含事务提交、磁盘IO等耗时操作,而删缓存是Redis DEL这样的纯内存操作(耗时微秒级),因此T 超过后两者之和的概率极低;

  • 可通过优化修复:即使发生,后续的“延时双删”方案能直接解决——第二次删除缓存会清除线程B写入的旧值,让下一次读请求加载最新数据,因此脏数据留存时间极短(最多等于延时等待时间,如500ms),属于“临时脏数据”;

  • 对比“先删缓存再更数据库”:后者的脏数据产生条件是“删缓存后、更数据库前有读请求”,这个时间窗口是“数据库事务执行时间”(毫秒~秒级),高并发下几乎必然发生,且无自动修复机制,因此是“永久性脏数据”。

  • 触发条件苛刻:仅当“读库时间T > 写库时间T + 删除缓存时间T”时才会发生。由于写库通常包含事务提交等耗时操作,而删缓存是纯内存操作,该时序窗口极窄;

  • 临时脏数据:即使发生,也可通过后续优化方案快速修正,影响周期短。

进阶优化:解决极端场景下的一致性问题

为解决“先更新数据库,再删除缓存”的极端并发问题及删除缓存失败的风险,需引入工程化优化方案,确保最终一致性。

  • 延时双删(解决极端并发脏数据)

核心思路:通过“两次删除缓存+中间延时”,覆盖“读库后写缓存”的时序窗口,彻底清除可能被回填的旧值,将极端并发下的脏数据风险降为零。

优化流程

  1. Update DB(更新数据库,确保事务提交成功);

  2. Del Cache(第一次删除缓存,清除旧值);

  3. Thread.sleep(500ms~1s)(关键延时:等待可能存在的“读库→写缓存”线程完成操作,延时时间需根据业务压测结果调整,覆盖读库+写缓存的最大耗时);

  4. Del Cache(第二次删除缓存:清除线程可能写入的旧值)。

原理说明:第一次删除是常规操作;延时等待是为了“兜底”可能的慢读线程;第二次删除则彻底清除慢读线程可能回填的旧值,确保后续读请求能加载数据库中的最新值。

  • 延时双删代码示例(C# + Redis)

以下是基于.NET/C#实现的延时双删示例,使用StackExchange.Redis作为Redis客户端,包含同步和异步两种实现(适配高并发场景):

usingStackExchange.Redis;usingSystem;usingSystem.Threading.Tasks;usingMicrosoft.EntityFrameworkCore;namespaceCacheConsistencyDemo{/// <summary>/// 缓存一致性服务(含延时双删实现)/// </summary>publicclassCacheConsistencyService{// Redis连接实例(实际项目中建议单例管理,通过IConnectionMultiplexer注入)privatereadonlyIDatabase_redisDb;// 数据库上下文(注入业务DB上下文,示例使用EF Core)privatereadonlyBusinessDbContext_dbContext;publicCacheConsistencyService(IConnectionMultiplexerredisMultiplexer,BusinessDbContextdbContext){_redisDb=redisMultiplexer.GetDatabase();_dbContext=dbContext;}/// <summary>/// 同步实现:延时双删 + 数据库更新/// 适用场景:低并发、简单业务场景/// </summary>/// <param name="userId">用户ID(业务主键)</param>/// <param name="newUserName">新用户名(更新字段)</param>publicvoidUpdateUserAndDelayDoubleDeleteCache(intuserId,stringnewUserName){if(string.IsNullOrWhiteSpace(newUserName))thrownewArgumentException("用户名不能为空",nameof(newUserName));usingvartransaction=_dbContext.Database.BeginTransaction();try{// 1. 更新数据库(核心业务操作,开启事务保证数据一致性)varuser=_dbContext.Users.Find(userId);if(user==null)thrownewKeyNotFoundException($"用户ID{userId}不存在");user.UserName=newUserName;_dbContext.SaveChanges();transaction.Commit();// 2. 构建缓存Key(遵循业务规范:模块:数据类型:主键)stringcacheKey=$"user:info:{userId}";// 3. 第一次删除缓存boolfirstDeleteSuccess=_redisDb.KeyDelete(cacheKey);Console.WriteLine($"第一次删除缓存{cacheKey}{firstDeleteSuccess?"成功":"失败(缓存不存在)"}");// 4. 延时等待(覆盖读库+写缓存的最大耗时,示例500ms)System.Threading.Thread.Sleep(500);// 5. 第二次删除缓存(兜底清除可能的旧值)boolsecondDeleteSuccess=_redisDb.KeyDelete(cacheKey);Console.WriteLine($"第二次删除缓存{cacheKey}{secondDeleteSuccess?"成功":"失败(缓存不存在)"}");}catch(Exceptionex){transaction.Rollback();// 异常处理:记录日志、告警(实际项目需结合日志框架如Serilog)Console.WriteLine($"更新数据并执行延时双删失败:{ex.Message}");throw;// 抛出异常,让上层业务处理(如重试、返回错误)}}/// <summary>/// 异步实现:延时双删 + 数据库更新/// 适用场景:高并发场景,避免阻塞主线程/// </summary>/// <param name="userId">用户ID</param>/// <param name="newUserName">新用户名</param>publicasyncTaskUpdateUserAndDelayDoubleDeleteCacheAsync(intuserId,stringnewUserName){if(string.IsNullOrWhiteSpace(newUserName))thrownewArgumentException("用户名不能为空",nameof(newUserName));awaitusingvartransaction=await_dbContext.Database.BeginTransactionAsync();try{// 1. 异步更新数据库varuser=await_dbContext.Users.FindAsync(userId);if(user==null)thrownewKeyNotFoundException($"用户ID{userId}不存在");user.UserName=newUserName;await_dbContext.SaveChangesAsync();awaittransaction.CommitAsync();// 2. 构建缓存KeystringcacheKey=$"user:info:{userId}";// 3. 第一次异步删除缓存boolfirstDeleteSuccess=await_redisDb.KeyDeleteAsync(cacheKey);Console.WriteLine($"第一次删除缓存(异步){cacheKey}{firstDeleteSuccess?"成功":"失败(缓存不存在)"}");// 4. 异步延时(使用Task.Delay,不阻塞主线程)awaitTask.Delay(500);// 5. 第二次异步删除缓存boolsecondDeleteSuccess=await_redisDb.KeyDeleteAsync(cacheKey);Console.WriteLine($"第二次删除缓存(异步){cacheKey}{secondDeleteSuccess?"成功":"失败(缓存不存在)"}");}catch(Exceptionex){awaittransaction.RollbackAsync();Console.WriteLine($"异步更新数据并执行延时双删失败:{ex.Message}");throw;}}}// 示例依赖:业务数据库上下文(EF Core)publicclassBusinessDbContext:DbContext{publicDbSet<User>Users{get;set;}protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){// 实际项目中需从配置文件读取连接字符串optionsBuilder.UseSqlServer("Server=.;Database=BusinessDB;Trusted_Connection=True;");}}// 示例业务实体:用户publicclassUser{publicintId{get;set;}// 主键publicstringUserName{get;set;}// 用户名publicstringEmail{get;set;}// 其他业务字段publicDateTimeCreateTime{get;set;}=DateTime.Now;}}

代码关键说明

  • 事务保障:数据库更新操作开启事务,确保更新失败时回滚,避免数据库自身数据不一致;

  • 缓存Key规范:采用“模块:数据类型:主键”格式(如user:info:1001),便于维护、排查问题及后续批量操作;

  • 异步优化:异步方法使用Task.Delay替代Thread.Sleep,避免阻塞主线程,提升高并发场景下的系统吞吐量;

  • 异常处理:包含事务回滚、日志记录,符合企业级应用的可靠性要求。

  • 重试机制(解决删除缓存失败问题)

若更新数据库成功后,删除缓存失败(如网络抖动、Redis服务临时不可用),会导致数据库是新值、缓存是旧值的不一致问题。需引入重试机制保障删除操作成功。

主流实现方案

  1. 同步重试(简单场景):

    • 删除缓存失败时,立即重试2~3次(重试次数需控制,避免无限重试导致阻塞);

    • 仍失败则记录日志并触发告警(如通过钉钉、邮件通知运维),由人工介入处理。

  2. 异步重试(高并发/高可用场景,推荐):

    • 核心思路:通过消息队列(如RabbitMQ、RocketMQ)实现异步通知,解耦业务逻辑与缓存删除操作;

    • 流程:① 更新数据库成功后,发送“删除缓存”消息到MQ(消息需包含缓存Key);② 消费者监听MQ消息,执行删除缓存操作;③ 若删除失败,MQ消息会重新入队重试(可设置最大重试次数,超过则告警)。

  • Binlog异步删除(终极方案)

为避免侵入业务代码,降低开发与维护成本,大厂普遍采用“Binlog监听”方案,通过中间件(如Canal、Debezium)异步删除缓存,实现业务与缓存操作的完全解耦。

核心原理:MySQL的Binlog记录了所有数据变更操作(增删改),中间件伪装成MySQL的从库,实时监听Binlog日志,解析出数据变更信息后异步触发缓存删除。

详细流程

  1. 业务代码仅负责更新数据库,不涉及任何缓存操作(彻底解耦);

  2. Canal伪装成MySQL从库,向主库发送Binlog同步请求;

  3. MySQL主库将Binlog日志同步给Canal;

  4. Canal解析Binlog日志,提取变更表名、主键、操作类型等信息;

  5. Canal根据解析结果生成“删除缓存”指令(如根据用户表主键生成cacheKey=user:info:1001);

  6. Canal异步调用Redis接口执行删除操作,若失败则自动重试(内置重试机制)。

核心优势

  • 完全解耦:业务代码无需关注缓存,降低开发与维护成本;

  • 高可靠性:中间件内置重试机制,保障删除操作最终成功;

  • 高扩展性:支持批量数据变更、多缓存集群同步等复杂场景。

各策略对比总结

为清晰呈现各方案的差异,便于技术选型,整理对比表格如下:

策略核心优点核心缺点脏数据类型推荐指数适用场景
先更新数据库,再更新缓存无明显优点无效写多,性能浪费;并发易出现写覆盖永久性/临时性无任何推荐场景
先更新缓存,再更新数据库无明显优点数据库更新失败会导致幽灵数据;无效写问题永久性无任何推荐场景
先删除缓存,再更新数据库逻辑简单,实现成本低高并发下极易产生脏数据;无自动修正机制永久性⭐⭐低并发、对一致性要求极低的非核心业务(如日志统计)
先更新数据库,再删除缓存安全性高,性能友好;实现简单极端并发下可能出现临时脏数据临时性(概率极低)⭐⭐⭐⭐大多数互联网业务的基础方案
先DB后Cache + 延时双删 + MQ重试一致性保障强,性能均衡;工程化落地成熟需引入MQ组件,实现稍复杂基本无脏数据⭐⭐⭐⭐⭐中高并发、对一致性要求较高的核心业务(如用户中心、订单系统)
Binlog异步删除(Canal)完全解耦业务与缓存;可靠性最高,无侵入需部署维护中间件,运维成本高基本无脏数据⭐⭐⭐⭐⭐大规模分布式系统、核心业务集群(如电商平台、金融核心系统)

面试应答指南

缓存一致性是分布式系统面试的高频问题,面试官重点考察候选人的技术选型能力、风险意识及工程化思维。建议按以下逻辑结构化应答:

  1. 定调核心前提:分布式系统中优先追求“最终一致性”,强一致性因性能代价过高,仅适用于金融级核心场景(如转账);

  2. 排除无效方案:先否定“直接更新缓存”的两类方案,理由是“无效写浪费性能”和“并发一致性风险”,体现对业界主流实践的了解;

  3. 推荐基础方案:首选“先更新数据库,再删除缓存”,说明其优势(安全性高、性能友好)及极小概率的极端问题,体现辩证思维;

  4. 补充优化方案:针对极端问题,提出“延时双删”(解决并发脏数据)和“MQ重试”(解决删除失败),并解释核心原理,体现工程化落地能力;

  5. 进阶方案拓展:提及“Binlog异步删除”方案,说明其解耦优势和大厂落地实践(如Canal),体现技术广度;

  6. 结合业务选型:强调技术方案需适配业务场景——中小业务用“延时双删+MQ”,大规模系统用“Canal+Binlog”,体现场景化思维。

总结

缓存一致性的核心是“在性能与一致性之间找到平衡”,互联网业务的主流选择是“最终一致性”。在实际开发中,应优先采用“先更新数据库,再删除缓存”的基础方案,并结合业务并发量与一致性要求,选择“延时双删”“MQ重试”或“Binlog异步删除”进行优化。

需注意:没有绝对完美的方案,只有最适配业务的方案。在技术选型时,需综合考虑开发成本、运维成本、并发量、一致性要求等因素,避免过度设计。同时,无论采用哪种方案,都需配套完善的监控告警机制,及时发现并处理潜在的一致性问题。

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

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

相关文章

Gemini认证失败?一文搞定所有疑难

Gemini认证疑难解答会技术文章大纲认证前的准备工作确保已安装最新版本的Gemini客户端或SDK 检查系统环境是否符合Gemini运行要求 确认网络连接稳定且能访问Gemini服务端常见认证失败原因分析API密钥无效或过期导致认证被拒绝 请求频率超出配额限制触发系统保护 时间戳偏差过大…

7. 为什么云厂商集体选择 vLLM

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;AWS、阿里云、字节跳动等全球顶级云厂商纷纷选择vLLM作为其大模型推理的核心框架。本文深入分析了云厂商集体选择vLLM的原因&#xff0c;包括高吞…

CF1781F Bracket Insertion

有一个空括号串 \(s\),接下来进行 \(n\) 次操作:假设当前括号序列长度为 \(l\),则在产生的 \(l+1\) 个空位中随机选择一个在当前空位以 \(p\) 的概率插入 \(\texttt{()}\),以 \(1-p\) 的概率插入 \(\texttt{)(}\)求…

8. vLLM vs TensorRT-LLM

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;vLLM和TensorRT-LLM是NVIDIA生态中最主流的两大推理框架。本文深入对比了vLLM与TensorRT-LLM的优劣&#xff0c;包括vLLM的灵活调度优势和TensorR…

如何配置Dev-C++使用特定的编译器版本?

在 Dev-C 中配置特定编译器版本需要手动操作&#xff0c;以下是详细步骤&#xff1a;1. 安装目标编译器版本下载所需版本的编译器&#xff08;如 MinGW 的特定 GCC 版本&#xff09;解压至独立目录&#xff08;例如&#xff1a;D:\MinGW-13.1&#xff09;2. 配置 Dev-C打开工具…

深入解析:浏览器底层探秘:Chrome的奇妙世界

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

4. 为什么 Triton 不够了

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;随着大模型规模和复杂度的急剧增长&#xff0c;传统推理框架Triton Inference Server在处理现代推理场景时逐渐显现出局限性。本文深入剖析了Trit…

如何在Dev-C++中设置编译器参数?

在Dev-C中设置编译器参数&#xff0c;可以通过以下步骤操作&#xff1a;1. 打开编译器设置点击顶部菜单栏的 "工具(Tools)" → 选择 "编译器选项(Compiler Options)"。2. 设置全局编译器参数在打开的窗口中&#xff1a;"编译器(Compiler)" 选项卡…

day143—递归—对称二叉树(LeetCode-101)

题目描述给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。示例 1&#xff1a;输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a;输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a;树中节点数目在…

5. vLLM 出现前的推理地狱

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2023年vLLM出现之前&#xff0c;大模型推理面临着显存碎片化、低效调度和高延迟等诸多挑战&#xff0c;被称为"推理地狱"。本文通过回顾pre-vLLM时代的痛点…

MCC音频剪辑工具v1.1.0.0:自动处理配音气口间隙 - 教程

MCC音频剪辑工具v1.1.0.0:自动处理配音气口间隙 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

6. PagedAttention 的历史背景

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; PagedAttention技术是vLLM的核心创新&#xff0c;它借鉴了操作系统中的虚拟内存分页管理思想&#xff0c;革命性地解决了大模型推理中的显存碎片化问题。本文追溯了P…

数据湖与数据仓库的演进与未来:一场技术辩论

内容&#xff1a;节目摘要 简介数据湖的未来两个技术栈会合二为一吗&#xff1f;数据网格&#xff1a;去中心化团队&#xff0c;统一架构&#xff1f;现代数据栈的下一个用例延迟&#xff1a;我们需要多低&#xff1f; 数据湖与仓库、分析与AI/ML、SQL与万物…… 随着数据湖和数…

RNR-Map:为视觉导航构建“可渲染”的新型视觉导航地图 - MKT

RNR-Map:为视觉导航构建“可渲染”的新型视觉导航地图https://mp.weixin.qq.com/s/5dFbWpGX8BeJwNt_MGIv-A 在视觉导航任务中,智能体(机器人)如何有效地存储和利用空间记忆是核心难题。传统的地图表征,如占据栅格…

全网最全MBA开题报告TOP8一键生成论文工具测评

全网最全MBA开题报告TOP8一键生成论文工具测评 2026年MBA开题报告写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着MBA学习的深入&#xff0c;开题报告成为每位学生必须面对的重要环节。然而&#xff0c;从选题构思到资料整理、框架搭建&#xff0c;再到内容撰写与格…

2. 训练 vs 推理:真正烧钱的是哪一步

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;AI行业的成本结构已经发生根本性转变。本文通过云厂商真实数据揭示&#xff0c;推理的累计成本已超过训练10倍以上&#xff0c;成为真正烧钱的环节…

win10 电脑 蓝牙耳机连接后没有声音

win10 电脑 蓝牙耳机连接后没有声音win10系统 技嘉z790m 冰雕主板 症状如下 蓝牙耳机有时连不上,有时连上了没有任何声音。 操作 设备管理器里把蓝牙下的所有项全部删除,然后重装。 没用 驱动总裁,技嘉官网重新下载…

为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑

为什么大厂都在做智能运维AI平台&#xff1f;AI应用架构师解析背后的商业逻辑 引言&#xff1a;一场运维故障引发的思考 2023年双11凌晨&#xff0c;某头部电商平台的支付系统突然宕机12分钟。尽管技术团队紧急修复&#xff0c;但这场故障仍导致&#xff1a; 直接交易损失超2亿…

3. OpenAI / DeepSeek 推理系统演进史

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 本文深入回顾了OpenAI与DeepSeek两大AI巨头的推理架构演进历程&#xff0c;从早期简单API到如今分布式MoE系统&#xff0c;提取了关键技术教训。通过分析OpenAI的扩展…

为什么所有主流LLM都使用SwiGLU?

本文的目标是解释为什么现代LLM架构在前馈部分使用 SwiGLU作为激活函数并且已经放弃了 ReLU。 神经网络本质上是一系列矩阵乘法&#xff0c;如果我们堆叠线性层而不使用任何激活函数&#xff1a; 无论你堆叠多少层&#xff0c;它仍然只是一个线性变换&#xff0c;网络只能学…