对 Rust 所有权、借用及生命周期的理解
从内存安全的角度理解 Rust 的所有权、借用与生命周期三大概念。所有权保证每个值只有一个所有者以避免数据竞争;借用以不获取所有权的方式访问值,分为可变与不可变借用;生命周期则用于避免悬垂引用、保证引用的有效性。文章通过 C++ 与 Rust 的对比代码,说明编译器如何强制检查这些规则以保障内存安全。
从内存安全的角度理解 Rust 的所有权、借用与生命周期三大概念。所有权保证每个值只有一个所有者以避免数据竞争;借用以不获取所有权的方式访问值,分为可变与不可变借用;生命周期则用于避免悬垂引用、保证引用的有效性。文章通过 C++ 与 Rust 的对比代码,说明编译器如何强制检查这些规则以保障内存安全。
高性能编程基石:缓存行原理(64 字节、空间局部性)、数组 vs 链表遍历性能对比(差 10+ 倍)、cachegrind 缓存未命中分析、MESI 协议、伪共享与 padding 解决方案、PostgreSQL 中 PG_CACHE_LINE_SIZE=128 的设计考量。
C++ 拷贝构造函数被调用的三种场景:对象初始化对象、函数传参(值传递)、函数返回对象,含完整代码示例与编译器优化(RVO/copy elision)对比分析。
为什么 C++ 空类和空结构体 sizeof 为 1 而不是 0?C++ 标准规定任何不同对象不能拥有相同内存地址,编译器为每个空类增加一个虚设字节以保证对象地址独立。
C++ 前置 ++(返回引用,无临时对象)与后置 ++(返回 const 值,含哑元 int 参数区分)的实现差异与效率对比,附完整代码与输出示例。
《C++PrimerPlus》读书笔记:函数模板与 decltype、友元机制、try-catch 异常处理、智能指针(unique_ptr/shared_ptr/weak_ptr)、C++11 新特性、Boost 库。
C++ 学习要点:五种编程范式(面向过程/对象/泛型/模板元/函数式)、移动语义与引用坍塌、std::forward 完美转发,附代码示例。
C++ 虚析构函数两个核心问题:什么时候需要虚析构(通过基类指针删除派生类对象时)以及虚函数如何工作(虚函数表 vtable 机制),含完整代码示例与对比输出。
Go 语言入门基础:安装配置、工程创建(go mod)、包与可见性、函数/defer/init、并发(goroutine、channel、WaitGroup、Context、Mutex)。
Linux 进程间通信之管道:pipe 函数创建匿名管道(父子进程)、mkfifo 创建命名管道(非父子进程),含完整代码示例与四种阻塞 I/O 特殊情况分析。
Linux 进程间通信之信号:信号的来源与种类、可靠/不可靠信号区别、内核处理时机(内核态返回用户态)、可重入函数问题,含 signal() 与 sigaction() 两段完整代码示例。
C 语言多线程编程总结:线程创建(pthread_create)、三种线程同步方式(互斥锁、条件变量、信号量),含完整代码示例与死锁分析。
从 SMP 对称多处理到 NUMA 非统一内存访问架构的演进,深入讲解 NUMA 节点、本地/远程内存访问时延差异,以及通过 numactl 与 sched_setaffinity 进行绑核、绑 NUMA 节点的亲和性优化实践。
SIMD 单指令多数据流详解:x86/ARM 指令集演进、编译器自动向量化(-O3 -march=native)、AVX2 Intrinsics 编程(_mm256_loadu_ps/add_ps)、PostgreSQL 中 CRC32C/JSON/simd.h 等实战优化。
STL 关联容器分析:set/map 基于红黑树 O(log n),unordered_map 基于哈希表 O(1),含 set/map/unordered_map 关键源码(底层 _Rb_tree / _Hashtable)与 operator[] 实现。
STL 堆算法源码分析:is_heap(判断堆性质)、make_heap(建堆)、push_heap(上移)、pop_heap(下移)、sort_heap(堆排序),含完整 annotate 源码。
STL 序列容器源码分析:vector(2 倍扩容)、list(双向链表)、deque(分段连续空间+map 指针数组)、stack/queue(基于 deque)、priority_queue(基于 vector 的堆实现),含关键源码注释与容器对比。
默认主从复制使用 default 用户连接,但生产环境通常禁用 default。为遵循最小权限原则,建议为复制连接建立专用用户,并通过 masteruser / masterauth 配置从节点以指定用户连接主节点。
Redis 6.0 引入 ACL(访问控制列表),支持多用户与细粒度权限控制。本文介绍如何创建用户、配置密码、划分命令与 Key 权限,以及与 Redis 6.0 之前单一密码模式的区别。
PostgreSQL 表空间决定数据库对象数据文件的物理位置,同时可指定优化器相关代价参数(seq_page_cost、random_page_cost 等)。本文分析表空间的实现机制及其对查询代价估算的影响。
这里我们分析一下PG数据库缓冲区的代码。缓冲区是十分重要的,对数据库的性能和稳定性有着直接的影响。缓冲区是数据库SQL计算层与外部存储(磁盘)交互的关键。数据页的落盘与读取,都要经过缓冲区。
PostgreSQL使用空闲空间映射表(FSM)快速定位有足够空间存储元组的页面,采用三层树状结构组织,在查找效率与存储开销之间取得精巧平衡
数据库技术相关的学习资源
数据库实际存储数据是通过表来存储的,具体到PostgreSQL中,是通过heap表实现的,它是存储引擎的基础。这里我们分析一下heap表。
PostgreSQL数据库的页面布局及元组布局
操作系统中一个进程能打开的文件数是受限制的,进程能获得的文件描述符是有限的,对于数据库进程来说,其经常会打开许多文件,很可能会超出操作系统的限制
PostgreSQL数据库中的解析器
站在数据库内核设计者的视角,从第一性原理出发,剖析类型系统为何存在、如何把宽松的 SQL 收敛为唯一确定的执行计划,以及隐式转换、延迟定型与内核落地的设计权衡
正则表达式
深入理解 LALR(1) 解析算法,以及 PostgreSQL 在上世纪 80 年代选择 LALR(1) 作为 SQL 解析器的技术原因与历史背景
SQL与关系数据库理论读书笔记
数据独立性,声明式查询
从前关系时代的混乱到 Codd 的关系模型,再到 SQL 的诞生,本文深入分析关系数据库理论产生的历史背景与核心问题,回答一个根本问题:为什么我们需要这一切?
C 语言 #include 预处理命令的学习笔记:其处理过程只是将头文件内容插入到指令所在位置,把头文件与当前源文件连成一体(与复制粘贴等价)。除常见的 #include "*.h" 外,#include 也能包含 .c 文件——如 #include "print.c" 等价把 print.c 的代码复制到该位置;并通过 gcc -E main.c 预处理输出验证被包含文件内容确实被复制到了指令处。
C 与 Rust 在变量声明上的对比:C 允许声明变量不初始化且编译器不检查,易引发运行时 BUG;Rust 要求必须初始化否则编译报错(error[E0381])。并对比可变性——Rust 默认不可变(let / let mut),C 默认可变(除非 const),探讨默认不可变如何把错误提前到编译期、提升代码可读性与工程实践。
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 命令。
Redis Cluster 原理分析:去中心化的分布式解决方案,数据分片与高可用;16384 个哈希槽与 CRC16 定位、clusterNode 的 slots 槽位数组;集群总线与 Gossip 协议(PING/PONG/MEET、CLUSTER MEET 自动发现);故障检测(PFAIL 主观下线、FAIL 客观下线与 quorum、flags 标志位);故障转移选举(clusterHandleSlaveFailover、failover_auth_sent/count);高可用流程(客观下线确认、configEpoch 配置纪元防脑裂、MOVED 重定向);以及去中心化、高性能、可扩展、最终一致性的设计原因。
基于《深入理解计算机系统》的 C 语言指针学习总结。介绍指针映射到机器代码的关键原则:每个指针都有类型(类型决定从起始地址读取多少字节、void * 通用指针);每个指针都有值(对象地址,NULL(0) 表示不指向任何地方);类型强制转换只改变类型不改变值、并改变指针运算的伸缩;指针也可指向函数(函数指针的值是其机器代码第一条指令的地址)。并通过一段 C 代码示例(Node/IntNode/CharNode)演示基于类型的重解释及其运行结果。
Redis Sentinel 哨兵模式运维实战:与 Redis 主从复制的关系、四大功能(监控/通知/自动故障转移/配置提供者)、sentinel.conf 全量配置详解、启动示例、部署建议(至少 3 节点)、Sentinel 命令集、运行时重配置、增删哨兵、SDOWN/ODOWN 机制,以及 VIP 切换方案。
Redis Sentinel 哨兵模式核心实现剖析:初始化、节点发现(Pub/Sub 与 INFO)、主观/客观下线检测、故障转移 Leader 选举(sentinelVoteLeader / sentinelGetLeader)与故障转移状态机(选从、提升、重配置从节点),以及 TILT 模式与 epoch 防脑裂机制。
从 AOF 原理、开启方式、文件重写,到源码层面分析 AOF 写入(call→propagate→feedAppendOnlyFile→flushAppendOnlyFile)与启动回放(loadAppendOnlyFile 伪客户端)的全过程。
分析大数据量下 Redis 执行 bgsave 因 fork() 复制页表导致主进程阻塞卡顿的成因,以及如何监控与优化(latest_fork_usec、THP、内存上限、Redis Cluster)。
分析 Redis Sentinel 在 failover 时如何调用 client-reconfig-script:脚本参数、脚本执行队列、sentinelRunPendingScripts 调度,以及两种触发时机(hello 消息、Info 命令)。
一篇 Redis 功能与原理的概览笔记,覆盖协议、五种基本数据类型、键与过期/逐出、多数据库、持久化、事务、Pipelining、客户端缓存与复制。
从宏观数据结构出发,解析 Redis Hash 类型的底层实现:字典、渐进式 rehash,以及 ziplist 与 hashtable 两种编码的转换。
从源码调用链分析 Redis 命令执行全流程,并与 PostgreSQL 对比,介绍事件循环、连接建立、命令读取解析与 RESP 协议。
从源码编译安装 Redis,介绍 redis.conf 常用配置、客户端基本使用,并通过启动主流程源码对比 Redis 与 PostgreSQL。
深入解析 Redis RDB 持久化机制,包括 fork 写时复制快照原理、BGSAVE 触发流程、rdbSave/rdbSaveRio 写文件实现、RDB 文件格式编码,以及 rdbLoad 启动时恢复数据的源码分析。
Redis 主从复制(全量/增量)、replicaof 配置、WAIT 命令、复制相关配置详解(repl-*、min-replicas、replica-announce 等),以及运行 ID/偏移量部分重同步原理与过期键处理。
深入解析 Redis 字符串(String)类型的底层实现,包括 SDS 简单动态字符串、embstr 编码、整数编码,以及空间预分配、惰性空间释放等内存优化设计,附带核心 C 源码分析。
阿里开源的 Redis 数据迁移/备份恢复工具 RedisShake 介绍,包含 sync/scan/rdb/aof 多种读取方式与 redis/file 写入方式的配置示例。
详解 Redis maxclients 配置、操作系统文件描述符限制及其与最大连接数的关系
详解 Redis protected-mode 的作用、与 default 用户密码的关系,以及主从复制场景下的排查建议
两种优雅关闭 Redis 的方式——SHUTDOWN 命令与 systemd 管理,并解析相关源码与 Redis 6/7 的差异
腾讯云数据库 Redis 的产品架构、代理层 Proxy、多可用区部署、故障切换、升级与备份恢复机制概览
从启用 TLS 端口、证书与密钥,到 CA 签发、主从复制与集群的 TLS 配置,完整讲解 Redis TLS 配置实践
详解 Redis 事务的实现原理——MULTI/EXEC/DISCARD/WATCH 命令、执行流程,以及基于 WATCH 的乐观锁源码分析
如何在不停机的情况下升级或重启 Redis 实例——通过副本切换、Sentinel/Cluster 滚动升级的完整步骤
解析 Redis 设置 vm.overcommit_memory=1 的原因——保障后台持久化 fork 成功,并附带 THP 等关键系统调优建议