全部文章(共 3223 篇)

当前排序: 最新
C++ std::shared_ptr 控制块的内存布局与开销分析
2026-05-28 04:19:01
C++ std::sharedptr 控制块的内存布局与开销分析 std::sharedptr 是 C++ 智能指针家族中最常用的成员之一,它通过引用计数实现自动生命周期管理。但许多开发者只知其用法,却忽略了其背后控制块(Control Block) 的精确内存布局与性能开销。本文将从内存分配、成员
C++ shared_ptr 控制块
35 0
C++ vector 的 emplace_back 为什么能省去临时对象的拷贝构造
2026-05-28 02:22:00
C++ vector 的 emplaceback 为什么能省去临时对象的拷贝构造 在 C++ 中,向 std::vector 尾部添加新元素时,传统做法是使用 pushback。但现代 C++ 推荐使用 emplaceback,因为它可以避免临时对象的构造和拷贝。理解其原理,能帮助你写出更高效的代码
C++ vector emplace_back
42 0
C++ std::string 的 SSO 机制对短字符串的内存优化原理
2026-05-28 00:23:00
C++ std::string 的 SSO 机制对短字符串的内存优化原理 为什么需要 SSO? std::string 是 C++ 中最常用的容器之一。其最朴素的实现是在堆上动态分配一块内存来存放字符数据。每次创建、复制或修改字符串都伴随着 malloc / free 或 new / delete
C++ std::string SSO
49 0
MySQL 的 Online DDL 在全量拷贝阶段如何处理并发的 DML 增量数据
2026-05-27 22:10:10
MySQL 的 Online DDL 在全量拷贝阶段如何处理并发的 DML 增量数据 在 MySQL 中,Online DDL(在线数据定义语言)允许你在不阻塞 DML(数据操作语言,如 INSERT、UPDATE、DELETE)的情况下修改表结构。其中,全量拷贝阶段(COPY 算法)是耗时最长的步
MySQL OnlineDDL 全量拷贝
37 0
Redis Stream 消费者组的 PEL 待处理条目如何实现消息的精确重投
2026-05-27 20:10:04
Redis Stream 消费者组的 PEL 待处理条目如何实现消息的精确重投 Redis Stream 的消费者组(Consumer Group)提供了一种可靠的消息队列模型。而 PEL(Pending Entries List,待处理条目列表)正是实现“消息精确重投”的核心机制。当消费者处理消息
RedisStream 消费者组 待处理条目
46 0
PostgreSQL 的 MVCC 为什么不需要像 MySQL 一样依赖 Undo Log
2026-05-27 18:10:46
PostgreSQL 的 MVCC 为什么不需要像 MySQL 一样依赖 Undo Log 核心差异:版本存储在哪里? 1. 明确两个数据库处理并发的方式 MVCC(多版本并发控制) 的核心思想是:每个事务看到的是数据的一个“快照”,而不是实时数据。修改不影响其他并发事务的读取。 MySQL(Inn
PostgreSQL MVCC UndoLog
38 0
Redis RDB 的 fork 写时复制 COW 在超大内存实例中的停顿风险
2026-05-27 16:24:17
Redis RDB 的 fork 写时复制 COW 在超大内存实例中的停顿风险 Redis 作为高性能内存数据库,其持久化机制中的 RDB(快照)方案依赖 fork 系统调用创建子进程。fork 结合写时复制(CopyOnWrite,COW)技术,本意是避免子进程复制父进程整个内存空间,从而节省内存
Redis RDB fork
35 0
MySQL 自适应哈希索引 AHI 为什么可能成为高并发更新下的性能瓶颈
2026-05-27 14:12:19
MySQL 自适应哈希索引 AHI 为什么可能成为高并发更新下的性能瓶颈 核心问题:AHI 在高并发更新时如何从加速器变成绊脚石 自适应哈希索引(Adaptive Hash Index,简称 AHI)是 InnoDB 存储引擎的一项优化特性。它自动为频繁访问的索引页构建哈希索引,将磁盘 B+ 树查找
自适应哈希索引 高并发更新 性能瓶颈
35 0
MongoDB TTL 索引自动删除过期文档的后台清理线程机制
2026-05-27 12:13:54
MongoDB TTL 索引自动删除过期文档的后台清理线程机制 MongoDB 提供了一种自动删除过期文档的机制:TTL 索引(TimeToLive Index)。当你对集合中的某个日期字段创建 TTL 索引后,MongoDB 会在后台启动一个清理线程,定期扫描该集合,删除那些字段值已经超过指定时间
MongoDB TTL索引 自动删除
29 0
MySQL Undo Log 在 MVCC 中的版本链构建与 ReadView 可见性判断
2026-05-27 06:11:07
MySQL Undo Log 在 MVCC 中的版本链构建与 ReadView 可见性判断 理解 MVCC 的核心组件 多版本并发控制(MVCC)是 MySQL InnoDB 引擎实现高并发读写的关键机制。它通过保留数据行的多个历史版本,让读操作无需等待写操作,从而提升性能。实现 MVCC 的两大核
MySQL MVCC UndoLog
36 0
Redis SCAN 命令基于高位进位的游标遍历为何能避免重复与阻塞
2026-05-27 03:24:00
Redis SCAN 命令基于高位进位的游标遍历为何能避免重复与阻塞 REmote DIctionary Server Redis 提供 KEYS 命令用于查找匹配模式的键。但 KEYS 会一次性返回所有匹配的键,在键数量巨大时导致服务器阻塞,无法处理其他请求。SCAN 命令应运而生:它通过基于高位
Redis SCAN命令 高位进位
37 0
MySQL Buffer Pool 的 LRU 链表为什么需要分为 Young 和 Old 区
2026-05-27 00:15:42
MySQL Buffer Pool 的 LRU 链表为什么需要分为 Young 和 Old 区 直接回答:为了 防止一次性大查询(如全表扫描) 把频繁访问的热数据从内存中“挤出去”,导致缓存命中率断崖式下降。下面通过拆解传统 LRU 的缺陷,然后展示分区后的工作机制,让你彻底理解这个设计。 1. 先
MySQL BufferPool LRU链表
40 0
Redis Sorted Set 底层跳表实现范围查询的时间复杂度与层级概率
2026-05-26 23:38:42
Redis Sorted Set 底层跳表实现范围查询的时间复杂度与层级概率 1. 跳表(Skip List)概述 Redis 的 Sorted Set 在元素数量较多或元素长度较大时,底层使用 跳表(skiplist) 作为有序集合的存储结构。跳表是一种基于并行链表的概率性数据结构,通过维护多层索
Redis 跳表 范围查询
34 0
Go 语言闭包捕获循环变量的延迟求值与常见的并发引用陷阱
2026-05-24 18:12:08
Go 语言闭包捕获循环变量的延迟求值与常见的并发引用陷阱 闭包是函数式编程的重要特性,Go 语言对其提供了良好支持。然而,当闭包在循环中捕获变量时,一个常见的陷阱会导致程序产生非预期的结果,尤其在并发编程中会引发难以调试的 Bug。本指南将直接演示该问题的本质,并提供清晰、可立即应用的解决方案。 问
Go语言 闭包 循环变量
50 0
Go recover 为什么只能拦截当前 Goroutine 的 panic 而无法跨协程
2026-05-24 15:14:21
Go recover 为什么只能拦截当前 Goroutine 的 panic 而无法跨协程 理解 panic 与 recover 的本质 思考一个场景:你和同事各自负责独立的项目模块,你在工作中遇到了一个无法解决的致命错误(panic)。你需要的是在自己负责的范围内尝试修复或妥善处理这个错误(rec
Go语言 panic机制 recover机制
43 0
Go bytes.Buffer 的连续扩容策略与 strings.Builder 的内存拷贝优化
2026-05-24 12:15:55
Go bytes.Buffer 的连续扩容策略与 strings.Builder 的内存拷贝优化 在Go语言中拼接大量字符串时,直接使用 + 运算符会导致多次内存分配和拷贝,性能低下。bytes.Buffer 和 strings.Builder 是两种高效的替代方案,但它们在内存管理策略上存在关键差
Go语言 bytes.Buffer strings.Builder
49 0
Go 语言 Goroutine 泄漏的常见模式与 runtime.NumGoroutine 监控
2026-05-24 09:21:08
Go 语言 Goroutine 泄漏的常见模式与 runtime.NumGoroutine 监控 Goroutine 泄漏是 Go 程序中一种隐蔽且危害巨大的资源问题。泄漏的 Goroutine 会持续消耗内存和调度资源,最终拖垮整个服务。本文将直接介绍几种最典型的泄漏模式,并提供一套基于 runt
Go语言 Goroutine泄漏 并发编程
49 0
Go unsafe.Pointer 与 uintptr 的转换为何受 GC 栈帧影响
2026-05-24 06:14:27
Go unsafe.Pointer 与 uintptr 的转换为何受 GC 栈帧影响 在 Go 的底层编程中,unsafe.Pointer 和 uintptr 是绕过类型系统、直接操作内存的两把利刃。一个常见且危险的做法是将 unsafe.Pointer 转换为 uintptr 进行指针算术,然后再
Go语言 unsafe.Pointer uintptr
38 0
Go sync.Cond 为什么必须在 Wait 前加锁与伪唤醒的防范
2026-05-24 03:13:13
Go sync.Cond 为什么必须在 Wait 前加锁与伪唤醒的防范 Go 语言的 sync.Cond 是一个强大的同步原语,用于在共享状态发生变化时通知等待的 goroutine。然而,它的使用比 mutex 和 channel 更容易出错。本文将直接剖析两个核心问题:为什么 Wait 方法调用
Go语言 sync.Cond Wait方法
53 0
Go 语言 defer 延迟调用在循环中为何容易导致资源延迟释放
2026-05-24 00:15:35
Go 语言 defer 延迟调用在循环中为何容易导致资源延迟释放 许多Go开发者习惯使用 defer 来确保资源(如文件、数据库连接)被释放,这通常是个好习惯。然而,当 defer 被用在循环体内时,极有可能引发一个隐蔽的性能问题:资源延迟释放。理解其原理并采用正确的写法,是编写健壮、高效Go程序的
Go语言 defer延迟调用 循环资源释放
43 0