PeekDB窥视数据库内部
  • 首页
  • 博客
  • 文档
  • 论文
  • 关于
中文/English

博客

数据库内核知识深度解析

      • PostgreSQL 缓冲区管理器
      • PostgreSQL 堆表存储
      • PostgreSQL 元组结构
      • PostgreSQL 空闲空间映射
      • PostgreSQL 表空间
      • PostgreSQL 虚拟文件描述符
        • SQL 解析器
        • 为什么是 LALR(1)
        • SQL 与关系理论
        • 为什么 SQL 基于关系理论
        • 为什么 SQL 仍然存在
        • 类型系统
      • 正则表达式
      • Cache Line 缓存行
      • NUMA 架构与 CPU 亲和性
      • SIMD 初识
        • 理解指针
        • C 与 Rust 变量声明对比
        • #include 预处理指令
        • 多线程编程
        • 管道
        • 信号
        • Go 基础
        • C++PrimerPlus 笔记
        • STL 序列容器
        • STL 堆算法
        • STL 关联容器
        • 拷贝构造函数调用时机
        • 虚析构函数
        • 空类/空结构体大小
        • 前置 ++ 与后置 ++ 重载
        • C++ 学习笔记
      • 更好的学习资源
        • Redis 用户管理
        • Redis 主从复制(masteruser)
        • Redis 最大客户端连接数
        • Redis 保护模式
        • Redis 配置 TLS
        • Redis 与 vm.overcommit_memory
        • Redis 升级
        • 优雅关闭 Redis
        • Redis 数据迁移工具 RedisShake
        • bgsave 导致的卡顿问题
        • 哨兵客户端重配置脚本
        • Redis 高可用与复制
        • 哨兵模式源码分析
        • Redis 哨兵模式
        • Redis Cluster
        • Redis Cluster 原理分析
        • Redis 事务
        • 腾讯云数据库 Redis
        • Redis 编译安装与使用
        • Redis 功能与原理概览
        • Redis 字符串类型实现(SDS)
        • Redis 持久化机制 RDB
        • Redis 持久化机制 AOF
        • Redis 如何执行一条命令
        • Redis Hash 类型的实现原理

对 Rust 所有权、借用及生命周期的理解

从内存安全的角度理解 Rust 的所有权、借用与生命周期三大概念。所有权保证每个值只有一个所有者以避免数据竞争;借用以不获取所有权的方式访问值,分为可变与不可变借用;生命周期则用于避免悬垂引用、保证引用的有效性。文章通过 C++ 与 Rust 的对比代码,说明编译器如何强制检查这些规则以保障内存安全。

发布于 2026年8月4日

理解 Cache Line 缓存行

高性能编程基石:缓存行原理(64 字节、空间局部性)、数组 vs 链表遍历性能对比(差 10+ 倍)、cachegrind 缓存未命中分析、MESI 协议、伪共享与 padding 解决方案、PostgreSQL 中 PG_CACHE_LINE_SIZE=128 的设计考量。

发布于 2026年7月31日

C++ 拷贝构造函数被调用的时机

C++ 拷贝构造函数被调用的三种场景:对象初始化对象、函数传参(值传递)、函数返回对象,含完整代码示例与编译器优化(RVO/copy elision)对比分析。

发布于 2026年7月31日

C++ 空类与空结构体的大小

为什么 C++ 空类和空结构体 sizeof 为 1 而不是 0?C++ 标准规定任何不同对象不能拥有相同内存地址,编译器为每个空类增加一个虚设字节以保证对象地址独立。

发布于 2026年7月31日

C++ 前置 ++ 与后置 ++ 运算符重载

C++ 前置 ++(返回引用,无临时对象)与后置 ++(返回 const 值,含哑元 int 参数区分)的实现差异与效率对比,附完整代码与输出示例。

发布于 2026年7月31日

C++PrimerPlus 笔记

《C++PrimerPlus》读书笔记:函数模板与 decltype、友元机制、try-catch 异常处理、智能指针(unique_ptr/shared_ptr/weak_ptr)、C++11 新特性、Boost 库。

发布于 2026年7月31日

C++ 学习笔记

C++ 学习要点:五种编程范式(面向过程/对象/泛型/模板元/函数式)、移动语义与引用坍塌、std::forward 完美转发,附代码示例。

发布于 2026年7月31日

C++ 虚析构函数

C++ 虚析构函数两个核心问题:什么时候需要虚析构(通过基类指针删除派生类对象时)以及虚函数如何工作(虚函数表 vtable 机制),含完整代码示例与对比输出。

发布于 2026年7月31日

Go 基础

Go 语言入门基础:安装配置、工程创建(go mod)、包与可见性、函数/defer/init、并发(goroutine、channel、WaitGroup、Context、Mutex)。

发布于 2026年7月31日

管道

Linux 进程间通信之管道:pipe 函数创建匿名管道(父子进程)、mkfifo 创建命名管道(非父子进程),含完整代码示例与四种阻塞 I/O 特殊情况分析。

发布于 2026年7月31日

信号

Linux 进程间通信之信号:信号的来源与种类、可靠/不可靠信号区别、内核处理时机(内核态返回用户态)、可重入函数问题,含 signal() 与 sigaction() 两段完整代码示例。

发布于 2026年7月31日

多线程编程

C 语言多线程编程总结:线程创建(pthread_create)、三种线程同步方式(互斥锁、条件变量、信号量),含完整代码示例与死锁分析。

发布于 2026年7月31日

NUMA 架构与 CPU 亲和性

从 SMP 对称多处理到 NUMA 非统一内存访问架构的演进,深入讲解 NUMA 节点、本地/远程内存访问时延差异,以及通过 numactl 与 sched_setaffinity 进行绑核、绑 NUMA 节点的亲和性优化实践。

发布于 2026年7月31日

SIMD 初识

SIMD 单指令多数据流详解:x86/ARM 指令集演进、编译器自动向量化(-O3 -march=native)、AVX2 Intrinsics 编程(_mm256_loadu_ps/add_ps)、PostgreSQL 中 CRC32C/JSON/simd.h 等实战优化。

发布于 2026年7月31日

STL 关联容器学习笔记

STL 关联容器分析:set/map 基于红黑树 O(log n),unordered_map 基于哈希表 O(1),含 set/map/unordered_map 关键源码(底层 _Rb_tree / _Hashtable)与 operator[] 实现。

发布于 2026年7月31日

STL 堆相关实现学习笔记

STL 堆算法源码分析:is_heap(判断堆性质)、make_heap(建堆)、push_heap(上移)、pop_heap(下移)、sort_heap(堆排序),含完整 annotate 源码。

发布于 2026年7月31日

STL 常用序列容器学习笔记

STL 序列容器源码分析:vector(2 倍扩容)、list(双向链表)、deque(分段连续空间+map 指针数组)、stack/queue(基于 deque)、priority_queue(基于 vector 的堆实现),含关键源码注释与容器对比。

发布于 2026年7月31日

Redis 主从复制:masteruser 配置

默认主从复制使用 default 用户连接,但生产环境通常禁用 default。为遵循最小权限原则,建议为复制连接建立专用用户,并通过 masteruser / masterauth 配置从节点以指定用户连接主节点。

发布于 2026年7月29日

Redis用户管理

Redis 6.0 引入 ACL(访问控制列表),支持多用户与细粒度权限控制。本文介绍如何创建用户、配置密码、划分命令与 Key 权限,以及与 Redis 6.0 之前单一密码模式的区别。

发布于 2026年7月29日

PostgreSQL支持在创建表空间时指定优化器代价参数

PostgreSQL 表空间决定数据库对象数据文件的物理位置,同时可指定优化器相关代价参数(seq_page_cost、random_page_cost 等)。本文分析表空间的实现机制及其对查询代价估算的影响。

发布于 2026年7月24日

PostgreSQL缓冲区管理器

这里我们分析一下PG数据库缓冲区的代码。缓冲区是十分重要的,对数据库的性能和稳定性有着直接的影响。缓冲区是数据库SQL计算层与外部存储(磁盘)交互的关键。数据页的落盘与读取,都要经过缓冲区。

发布于 2026年7月23日

PostgreSQL空闲空间映射表

PostgreSQL使用空闲空间映射表(FSM)快速定位有足够空间存储元组的页面,采用三层树状结构组织,在查找效率与存储开销之间取得精巧平衡

发布于 2026年7月20日

数据库推荐的学习资源

数据库技术相关的学习资源

发布于 2026年7月17日

PostgreSQL存储引擎heap表分析

数据库实际存储数据是通过表来存储的,具体到PostgreSQL中,是通过heap表实现的,它是存储引擎的基础。这里我们分析一下heap表。

发布于 2026年7月17日

PostgreSQL页面布局及元组布局

PostgreSQL数据库的页面布局及元组布局

发布于 2026年7月17日

PostgreSQL虚拟文件描述符——VFD机制

操作系统中一个进程能打开的文件数是受限制的,进程能获得的文件描述符是有限的,对于数据库进程来说,其经常会打开许多文件,很可能会超出操作系统的限制

发布于 2026年7月17日

SQL解析器

PostgreSQL数据库中的解析器

发布于 2026年7月17日

关系数据库类型系统设计思考

站在数据库内核设计者的视角,从第一性原理出发,剖析类型系统为何存在、如何把宽松的 SQL 收敛为唯一确定的执行计划,以及隐式转换、延迟定型与内核落地的设计权衡

发布于 2026年7月17日

正则表达式

正则表达式

发布于 2026年7月9日

LALR(1) 是什么?为什么 PostgreSQL 选择使用它?

深入理解 LALR(1) 解析算法,以及 PostgreSQL 在上世纪 80 年代选择 LALR(1) 作为 SQL 解析器的技术原因与历史背景

发布于 2026年7月6日

《SQL与关系数据库理论》读书笔记

SQL与关系数据库理论读书笔记

发布于 2026年7月4日

为什么会有SQL

数据独立性,声明式查询

发布于 2026年7月4日

为什么会有 SQL 与关系数据库理论?—— 一场数据独立性的革命

从前关系时代的混乱到 Codd 的关系模型,再到 SQL 的诞生,本文深入分析关系数据库理论产生的历史背景与核心问题,回答一个根本问题:为什么我们需要这一切?

发布于 2026年7月4日

#include 预处理指令

C 语言 #include 预处理命令的学习笔记:其处理过程只是将头文件内容插入到指令所在位置,把头文件与当前源文件连成一体(与复制粘贴等价)。除常见的 #include "*.h" 外,#include 也能包含 .c 文件——如 #include "print.c" 等价把 print.c 的代码复制到该位置;并通过 gcc -E main.c 预处理输出验证被包含文件内容确实被复制到了指令处。

发布于 2026年3月15日

C 与 Rust 变量声明对比

C 与 Rust 在变量声明上的对比:C 允许声明变量不初始化且编译器不检查,易引发运行时 BUG;Rust 要求必须初始化否则编译报错(error[E0381])。并对比可变性——Rust 默认不可变(let / let mut),C 默认可变(除非 const),探讨默认不可变如何把错误提前到编译期、提升代码可读性与工程实践。

发布于 2026年3月15日

Redis Cluster

Redis Cluster 官方集群方案深度指南:去中心化架构、16384 槽位与 CRC16 定位算法(含 keyHashSlot 源码)、哈希标签、MOVED/ASK 跳转与客户端纠正机制、Gossip 故障检测(PFail/Fail)、槽位迁移与容错;源码解析节点启动与 clusterCron、集群初始化(redis-cli --cluster create);集群搭建(三主示例、cluster info/nodes)、高可用主从分配与故障转移、扩缩容(add-node/reshard/rebalance/del-node)、备份恢复与常用 cluster 命令。

发布于 2026年3月15日

Redis Cluster 原理分析

Redis Cluster 原理分析:去中心化的分布式解决方案,数据分片与高可用;16384 个哈希槽与 CRC16 定位、clusterNode 的 slots 槽位数组;集群总线与 Gossip 协议(PING/PONG/MEET、CLUSTER MEET 自动发现);故障检测(PFAIL 主观下线、FAIL 客观下线与 quorum、flags 标志位);故障转移选举(clusterHandleSlaveFailover、failover_auth_sent/count);高可用流程(客观下线确认、configEpoch 配置纪元防脑裂、MOVED 重定向);以及去中心化、高性能、可扩展、最终一致性的设计原因。

发布于 2026年3月15日

理解指针

基于《深入理解计算机系统》的 C 语言指针学习总结。介绍指针映射到机器代码的关键原则:每个指针都有类型(类型决定从起始地址读取多少字节、void * 通用指针);每个指针都有值(对象地址,NULL(0) 表示不指向任何地方);类型强制转换只改变类型不改变值、并改变指针运算的伸缩;指针也可指向函数(函数指针的值是其机器代码第一条指令的地址)。并通过一段 C 代码示例(Node/IntNode/CharNode)演示基于类型的重解释及其运行结果。

发布于 2026年3月15日

Redis 哨兵模式

Redis Sentinel 哨兵模式运维实战:与 Redis 主从复制的关系、四大功能(监控/通知/自动故障转移/配置提供者)、sentinel.conf 全量配置详解、启动示例、部署建议(至少 3 节点)、Sentinel 命令集、运行时重配置、增删哨兵、SDOWN/ODOWN 机制,以及 VIP 切换方案。

发布于 2026年3月12日

Redis 哨兵模式源码分析

Redis Sentinel 哨兵模式核心实现剖析:初始化、节点发现(Pub/Sub 与 INFO)、主观/客观下线检测、故障转移 Leader 选举(sentinelVoteLeader / sentinelGetLeader)与故障转移状态机(选从、提升、重配置从节点),以及 TILT 模式与 epoch 防脑裂机制。

发布于 2026年3月10日

Redis 持久化机制——AOF 篇

从 AOF 原理、开启方式、文件重写,到源码层面分析 AOF 写入(call→propagate→feedAppendOnlyFile→flushAppendOnlyFile)与启动回放(loadAppendOnlyFile 伪客户端)的全过程。

发布于 2026年3月5日

Redis 执行 bgsave 导致的卡顿问题

分析大数据量下 Redis 执行 bgsave 因 fork() 复制页表导致主进程阻塞卡顿的成因,以及如何监控与优化(latest_fork_usec、THP、内存上限、Redis Cluster)。

发布于 2026年3月5日

哨兵客户端重配置脚本(client-reconfig-script)

分析 Redis Sentinel 在 failover 时如何调用 client-reconfig-script:脚本参数、脚本执行队列、sentinelRunPendingScripts 调度,以及两种触发时机(hello 消息、Info 命令)。

发布于 2026年3月5日

Redis 学习笔记:功能与原理概览

一篇 Redis 功能与原理的概览笔记,覆盖协议、五种基本数据类型、键与过期/逐出、多数据库、持久化、事务、Pipelining、客户端缓存与复制。

发布于 2026年3月5日

Redis 中 Hash 类型的实现原理

从宏观数据结构出发,解析 Redis Hash 类型的底层实现:字典、渐进式 rehash,以及 ziplist 与 hashtable 两种编码的转换。

发布于 2026年3月5日

Redis 是如何执行一条命令的

从源码调用链分析 Redis 命令执行全流程,并与 PostgreSQL 对比,介绍事件循环、连接建立、命令读取解析与 RESP 协议。

发布于 2026年3月5日

Redis 编译安装与使用

从源码编译安装 Redis,介绍 redis.conf 常用配置、客户端基本使用,并通过启动主流程源码对比 Redis 与 PostgreSQL。

发布于 2026年3月5日

Redis 持久化机制——RDB 篇

深入解析 Redis RDB 持久化机制,包括 fork 写时复制快照原理、BGSAVE 触发流程、rdbSave/rdbSaveRio 写文件实现、RDB 文件格式编码,以及 rdbLoad 启动时恢复数据的源码分析。

发布于 2026年3月5日

Redis 高可用与复制

Redis 主从复制(全量/增量)、replicaof 配置、WAIT 命令、复制相关配置详解(repl-*、min-replicas、replica-announce 等),以及运行 ID/偏移量部分重同步原理与过期键处理。

发布于 2026年3月5日

Redis 字符串类型的实现原理(SDS)

深入解析 Redis 字符串(String)类型的底层实现,包括 SDS 简单动态字符串、embstr 编码、整数编码,以及空间预分配、惰性空间释放等内存优化设计,附带核心 C 源码分析。

发布于 2026年3月5日

RedisShake 数据迁移工具介绍

阿里开源的 Redis 数据迁移/备份恢复工具 RedisShake 介绍,包含 sync/scan/rdb/aof 多种读取方式与 redis/file 写入方式的配置示例。

发布于 2026年3月5日

Redis 最大客户端连接数

详解 Redis maxclients 配置、操作系统文件描述符限制及其与最大连接数的关系

发布于 2026年1月9日

Redis 保护模式

详解 Redis protected-mode 的作用、与 default 用户密码的关系,以及主从复制场景下的排查建议

发布于 2026年1月9日

如何优雅关闭 Redis 服务

两种优雅关闭 Redis 的方式——SHUTDOWN 命令与 systemd 管理,并解析相关源码与 Redis 6/7 的差异

发布于 2026年1月9日

腾讯云数据库 Redis 介绍

腾讯云数据库 Redis 的产品架构、代理层 Proxy、多可用区部署、故障切换、升级与备份恢复机制概览

发布于 2026年1月9日

Redis 如何配置 TLS

从启用 TLS 端口、证书与密钥,到 CA 签发、主从复制与集群的 TLS 配置,完整讲解 Redis TLS 配置实践

发布于 2026年1月9日

Redis 事务

详解 Redis 事务的实现原理——MULTI/EXEC/DISCARD/WATCH 命令、执行流程,以及基于 WATCH 的乐观锁源码分析

发布于 2026年1月9日

Redis 升级

如何在不停机的情况下升级或重启 Redis 实例——通过副本切换、Sentinel/Cluster 滚动升级的完整步骤

发布于 2026年1月9日

为什么 Redis 要配置 vm.overcommit_memory=1

解析 Redis 设置 vm.overcommit_memory=1 的原因——保障后台持久化 fork 成功,并附带 THP 等关键系统调优建议

发布于 2026年1月9日
© 2026 PeekDB— 内容以 CC BY 4.0 许可发布CC BY 4.0
隐私政策使用条款GitHub