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

DB::table(‘posts‘)->where(‘id‘, $postId)->increment(‘likes‘, $count);的庖丁解牛

它的本质是一条看似简单的“自增”语句在底层被转化为UPDATE posts SET likes likes ? WHERE id ?。虽然它在 SQL 层面是原子的不会读到脏数据但在高并发场景下它会导致严重的行锁等待 (Row Lock Wait)和索引页争用 (Index Page Contention)。对于热门帖子这行代码就是导致数据库 CPU 飙升、响应延迟激增的元凶**。如果把数据库比作银行柜台increment()是排队改账本。流程顾客 A 走到柜台 - 柜员锁定账本第 10 页加行锁- 读取当前余额 100 - 计算 1001101 - 写入 101 - 解锁。并发问题顾客 B、C、D… 同时来改第 10 页。他们必须串行排队。A 没办完B 只能干等Lock Wait。后果队伍越来越长柜台处理速度越来越慢最后大堂经理连接池崩溃。RedisINCR是电子计数器。流程顾客按一下按钮数字自动1。无需排队微秒级完成。优势完全异步无锁竞争。核心逻辑别让所有人都去抢同一本账本。把记账工作交给高速缓存账本只在最后对一次总账。一、SQL 本质它到底做了什么1. 生成的 SQLLaravel 的increment方法最终生成UPDATEpostsSETlikeslikes1WHEREid123;-- 如果 $count 1UPDATEpostsSETlikeslikes5WHEREid123;2. 原子性保证 (Atomicity)正确性在 InnoDB 引擎中这条语句是原子的。它不是SELECT likes-PHP计算-UPDATE。它是直接在存储引擎层完成读取计算写入。结论数据不会错不会少加这是它唯一的优点。3. 锁机制 (Locking)行锁 (Row Lock)InnoDB 会对id123这一行加X锁 (Exclusive Lock)。持续时间直到事务提交。影响其他任何试图修改或锁定该行的事务包括另一个increment都必须等待。 核心洞察increment保证了数据的“正确性”但牺牲了系统的“并发性”。在低并发下没问题在高并发下是灾难。二、并发危害为什么它是热点杀手1. 行锁等待 (Lock Wait)场景爆款文章每秒 1000 人点赞。现象Thread 1 获得锁执行 UPDATE (耗时 1ms)。Thread 2-1000 进入Lock Wait Queue。Thread 2 等待 1msThread 1000 等待 1000ms (1秒)。后果接口响应时间线性增长用户感觉“卡死”。2. 上下文切换开销 (Context Switch Overhead)机制MySQL 线程不断在“运行”和“等待锁”之间切换。后果CPU 大量时间花在调度线程上而非执行 SQL 上。sys态 CPU 使用率飙升。3. 索引页争用 (Index Page Latch Contention)机制id是主键聚簇索引。频繁更新同一行会导致该索引页在 Buffer Pool 中被频繁读写。后果即使没有行锁等待内存层面的Latch (闩锁)竞争也会限制吞吐量。4. Binlog 压力机制每次UPDATE都会生成 Binlog 日志。后果高频小事务导致 Binlog 文件迅速膨胀主从同步延迟增加。三、性能优化如果必须用 DB怎么救如果你不能引入 Redis必须在 MySQL 层面优化1. 批量合并 (Batching)策略不要在每个请求中都调用increment。实现在 PHP 内存中累计计数。每隔 1 秒或每满 100 次执行一次DB::...-increment(likes, 100)。效果将 100 次行锁竞争合并为 1 次。风险服务重启会丢失未刷新的计数。2. 减少事务范围策略确保increment在一个极短的事务中执行尽快提交。代码DB::transaction(function()use($postId){DB::table(posts)-where(id,$postId)-increment(likes);// 不要在这里做其他耗时操作});3. 乐观锁重试 (Optimistic Locking Retry) -不推荐用于计数说明乐观锁适合状态变更不适合高频计数因为冲突率太高重试会导致更严重的 CPU 浪费。四、替代方案架构级解法方案 ARedis INCR 异步落库 (最佳实践)流程写Redis::incr(post:{$id}:likes)。原子操作无锁微秒级。读直接读 Redis 获取点赞数。同步定时任务每分钟将 Redis 计数同步到 MySQL。消息队列每次INCR发送 MQ消费者批量更新 MySQL。优势彻底解除数据库行锁瓶颈支撑万级 QPS。一致性最终一致性。用户看到的可能比实际多/少几秒但可接受。方案 BMySQL 延迟更新 (Write-Behind)流程PHP 接收请求将(post_id, user_id)放入本地内存数组或 APCu。当数组达到阈值如 50 个一次性执行UPDATE ... SET likes likes 50。优势减少 DB 交互次数。劣势单机部署有效集群部署复杂。方案 C分表/分库 (Sharding)流程将点赞记录分散到多个表中。劣势架构复杂度极高对于单纯的计数场景杀鸡用牛刀。 总结原子化“DB Increment”全景图维度关键点本质基于行锁的原子更新高并发下的性能瓶颈SQL 行为UPDATE table SET col col 1 WHERE id ?主要危害行锁等待、上下文切换、Binlog 膨胀适用场景低频更新、非热点数据、强一致性要求极高禁忌场景爆款文章点赞、秒杀库存扣减、高频计数器最佳替代Redis INCR 异步持久化PHP 隐喻Mutex Lock on Database Row公式Throughput 1 / (Lock_Wait_Time Execution_Time)终极心法DB Increment 的本质是“用串行化换取正确性”。在低并发时它是安全的捷径在高并发时它是致命的堵塞点。别让数据库承担它不该承担的计数压力。于原子中见安全于锁中见瓶颈以架构为尺解单点之牛于高并发工程中求吞吐之真。行动指令审查代码找出项目中所有的increment调用。评估频率哪些是热点数据如文章点赞、视频播放量重构热点将热点计数迁移到 RedisINCR。保留冷点低频数据如文章评论数、后台统计可以保留 DBincrement简化架构。思维升级记住数据库擅长存数据和复杂查询但不擅长高频简单计数。把计数交给 Redis把存储交给 MySQL。

相关文章:

DB::table(‘posts‘)->where(‘id‘, $postId)->increment(‘likes‘, $count);的庖丁解牛

它的本质是:一条看似简单的“自增”语句,在底层被转化为 UPDATE posts SET likes likes ? WHERE id ?。虽然它在 SQL 层面是原子的(不会读到脏数据),但在高并发场景下,它会导致严重的 行锁等待 (Row L…...

Ryzen SDT调试工具:解锁AMD处理器底层性能调优的专业指南

Ryzen SDT调试工具:解锁AMD处理器底层性能调优的专业指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

如何用Windows Cleaner彻底解决C盘空间不足:简单三步释放30GB空间

如何用Windows Cleaner彻底解决C盘空间不足:简单三步释放30GB空间 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专门为Window…...

终极Blender插件指南:无缝导入Rhino 3D模型的完整解决方案

终极Blender插件指南:无缝导入Rhino 3D模型的完整解决方案 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经在Rhino中精心设计的3D模型,在导入…...

ComfyUI-Manager终极指南:5分钟快速部署与完整功能解析

ComfyUI-Manager终极指南:5分钟快速部署与完整功能解析 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...

BTW:极简命令行工具,无缝集成终端工作流,高效管理碎片信息

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫sanarberkebayram/btw。乍一看这个仓库名,很多人可能一头雾水,不知道这个“btw”到底指的是什么。作为一个经常在开源社区里淘金的老手,我习惯性地会去深挖一下这类…...

终极指南:如何快速上手 ComfyUI-Manager 扩展管理工具

终极指南:如何快速上手 ComfyUI-Manager 扩展管理工具 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custo…...

Zotero插件组合拳:用Zotfile+QuickLook+Sci-hub,打造你的高效文献工作流(保姆级配置)

Zotero科研生产力套装:从文献获取到高效管理的全链路优化方案 第一次打开Zotero时,我被它简洁的界面和强大的文献收集功能所吸引。但很快发现,随着文献数量的增加,管理效率急剧下降——PDF文件命名混乱、快速预览不便、付费墙阻隔…...

从芯片内部看世界:手把手教你用Verilog在FPGA上点灯(入门必备的5个基础门电路实验)

从芯片内部看世界:手把手教你用Verilog在FPGA上点灯 第一次接触FPGA开发时,我被这个神奇的世界深深吸引——几行代码就能在硬件上创造出各种逻辑功能。还记得当初点亮第一个LED时的兴奋,仿佛打开了数字世界的大门。本文将带你从最基础的门电路…...

基于Django构建开源提示词管理系统Vidura:从设计到部署全指南

1. 项目概述:为什么我们需要一个专业的提示词管理系统?如果你和我一样,每天都在和ChatGPT、Midjourney或者各种AI模型打交道,那你肯定遇到过这个场景:脑子里突然冒出一个绝妙的提示词(Prompt)&a…...

3步实现游戏模组革命:BepInEx插件框架的完整实践指南

3步实现游戏模组革命:BepInEx插件框架的完整实践指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 你是否厌倦了游戏中一成不变的玩法?想要为心爱的游戏添…...

AI大模型发展全景图:从Transformer到多模态的技术演进与学习指南

1. 项目概述:一份AI大模型发展的全景图如果你最近也在关注AI领域,尤其是大语言模型(LLM)的进展,可能会和我有同样的感觉:信息爆炸,迭代太快。今天这家公司发布了一个新模型,明天那个…...

别再只画图了!用Python的Confusion Matrix类一键计算并可视化模型精度、召回率

别再只画图了!用Python的Confusion Matrix类一键计算并可视化模型精度、召回率 在机器学习项目的最后阶段,我们常常需要评估分类模型的性能。很多开发者习惯性地打开matplotlib,绘制一个标准的混淆矩阵图表就宣告任务完成。但真正的模型评估…...

3大核心功能!NS-USBLoader:Switch玩家的全能文件管理神器

3大核心功能!NS-USBLoader:Switch玩家的全能文件管理神器 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcod…...

从“为什么”到“怎么做”:给C语言新手的MISRA-C-2012核心规则精讲(规则10.1/15.6/17.7详解)

从“为什么”到“怎么做”:给C语言新手的MISRA-C-2012核心规则精讲 在嵌入式开发领域,MISRA-C标准就像一位严格的导师,时刻提醒我们规避那些看似合理却暗藏风险的编码习惯。对于刚掌握C语言语法却缺乏工业级开发经验的程序员来说,…...

从零搭建私有Helm Chart仓库:ChartMuseum架构解析与K8S生产实践

1. 项目概述:为什么我们需要一个私有的 Helm Chart 仓库?在云原生和 Kubernetes 生态中,Helm 作为事实上的“包管理器”,其重要性不言而喻。它让部署复杂的应用变得像安装一个软件包一样简单。但当我们从个人学习或小团队开发&…...

别再死记if语法了!通过水仙花数、三角形判断,带你理解Python分支的‘思维模型’

从水仙花数到三角形判断:Python分支结构的思维跃迁 当新手程序员第一次接触if语句时,往往会被其表面上的简单所迷惑——语法规则清晰明了,示例代码一看就懂。然而,当他们真正面对实际问题时,却常常陷入困境&#xff1a…...

别再死记硬背了!用Python和逻辑分析仪,动态解析TTL与非门的电压传输特性曲线

用Python动态解析TTL与非门的电压传输特性曲线 在数字电路的学习中,TTL与非门是最基础也最重要的组件之一。传统的学习方式往往依赖于死记硬背电压传输特性曲线,这不仅枯燥,也难以真正理解电路在不同工作状态下的动态行为。本文将介绍如何利…...

突破《原神》帧率限制:内存注入技术的实战部署指南

突破《原神》帧率限制:内存注入技术的实战部署指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 在追求极致游戏体验的道路上,60帧的硬性限制已成为高刷新率显示…...

阴阳师百鬼夜行AI自动化脚本:深度解析智能决策架构与算法优化

阴阳师百鬼夜行AI自动化脚本:深度解析智能决策架构与算法优化 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript Onmyoji Auto Script的百鬼夜行自动化脚本通过先进的计…...

从“玩具”到“产品”:用LangChain Prompt Templates设计稳定可靠的AI提示工程

从原型到生产:LangChain提示模板工程化实践指南 当AI应用从演示环境走向真实生产时,那些在测试阶段表现良好的临时提示(Prompt)往往会暴露出各种问题——输出不稳定、格式混乱、边界情况处理能力差。这就像用橡皮筋搭建的桥梁&am…...

Arm CoreLink NI-700 NoC架构与电源管理技术解析

1. Arm CoreLink NI-700 NoC架构概览 在现代SoC设计中,片上网络(NoC)已成为连接处理器、内存控制器和各类加速器的核心基础设施。Arm CoreLink NI-700作为第五代NoC解决方案,采用分布式路由架构,支持AXI5、AHB5等最新AMBA协议,其创…...

5分钟学会专业级GPU显存稳定性测试:memtest_vulkan完整指南

5分钟学会专业级GPU显存稳定性测试:memtest_vulkan完整指南 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 你的显卡真的健康吗?当你沉浸…...

避坑指南:STM32F407+RT-Thread解码SD卡JPG图片到LCD,内存与性能优化实战

STM32F407RT-Thread实战:JPG解码性能优化与内存管理精要 在嵌入式图像处理领域,JPG解码一直是资源受限设备面临的典型挑战。当开发者尝试在STM32F407这类中等性能MCU上实现SD卡JPG图片解码并输出到LCD时,往往会遭遇解码速度慢、大图显示死机…...

BookGet:如何一键下载全球50+数字图书馆的古籍资源?

BookGet:如何一键下载全球50数字图书馆的古籍资源? 【免费下载链接】bookget bookget 数字古籍图书下载工具 项目地址: https://gitcode.com/gh_mirrors/bo/bookget 你是否曾为寻找珍贵古籍文献而烦恼?作为一名历史爱好者、学术研究者…...

ai赋能科学减碳:在快马平台开发智能sbti目标推荐系统

最近在做一个关于企业碳减排目标设定的项目,发现科学碳目标倡议(SBTi)的设定过程其实挺复杂的。作为一个开发者,我尝试用AI来简化这个过程,在InsCode(快马)平台上做了一个智能推荐系统。这里分享一下开发过程和经验。 项目背景与需求分析 S…...

别再只调参了!用Flask+ECharts给随机森林/XGBoost农业预测模型做个可视化大屏(附完整源码)

从模型到产品:用FlaskECharts打造农业预测可视化系统实战指南 当你的随机森林模型在Jupyter Notebook里跑出0.95的R2分数时,是否想过如何让农业合作社的技术员真正用上这个成果?本文将带你跨越从算法原型到可交互产品的最后一公里。不同于单…...

零刻EQ12 N100小主机保姆级All in One搭建:从ESXI8.0到iKuai旁路由的完整避坑记录

零刻EQ12 N100小主机All in One实战:从ESXI8.0部署到iKuai旁路由的深度指南 当一台巴掌大的迷你主机遇上虚拟化技术,家庭网络和存储的玩法将被彻底改写。零刻EQ12 N100凭借其双2.5G网口和低功耗特性,正成为DIY爱好者构建All in One系统的热门…...

对话机器人工程化实践:从架构设计到生产部署的完整指南

1. 项目概述与核心价值 最近在开源社区里,一个名为 moltbot-best-practices 的项目引起了我的注意。这个项目托管在 NextFrontierBuilds 组织下,名字直译过来是“MoltBot最佳实践”。乍一看,你可能会觉得这又是一个围绕某个特定聊天机器人…...

Go语言原生AI Agent框架:构建高性能、类型安全的智能应用

1. 项目概述:为什么Go需要一个原生的AI Agent框架 在当前的AI开发浪潮中,Python生态几乎占据了绝对主导地位,从PyTorch、TensorFlow到LangChain、LlamaIndex,开发者们被海量的Python库所包围。作为一名长期在后台系统、高并发服务…...