本项目是一个个人学习性质的开源项目,旨在系统阅读,整理、实现优秀的数据结构与算法,并结合实际编程语言知识沉淀项目经验。基于对Go语言的热爱与探索,项目中的绝大多数实现均采用Go语言完成。在设计与实现过程中,注重代码的可扩展性,每个功能模块都尽量以独立函数库的形式呈现,便于后续复用与拓展。同时,在代码实现上追求简洁清晰,剔除冗余逻辑,专注于保留最核心、最本质的实现内容,帮助理解底层原理。
布隆过滤器(Bloom Filter),用于高效判断一个元素是否可能存在于集合中。通过使用多个64位哈希函数和紧凑的位图(bitmap)结构,布隆过滤器以极低的空间开销支持大量数据的存储与查询。每次添加或查询元素时,均通过多个哈希函数计算出对应的位索引,并在位图上进行设置或检查操作。由于其概率性特性,布隆过滤器可能会存在一定的误判率,但不会漏判。这种结构特别适合用于缓存穿透防护、大规模数据检索等场景。
跳表(Skip Table),是一种基于链表结构的高效有序字典,支持快速插入、删除和查找操作。跳表通过多级索引结构将时间复杂度降低至 O(log n) 的期望水平,特别适合处理大规模有序数据。其核心思想是在原始链表之上构建多层“跳跃”指针,从而跳过大量节点以加速访问。本实现使用随机化策略决定节点的高度(层数),确保结构平衡性的同时简化了实现逻辑。
该代码实现了一个本地缓存组件(LocalCache)及其发布者(LocalCachePublisher),用于在分布式系统中高效缓存和同步数据。整体设计结合了 Redis 和本地缓存的优势,兼顾性能与一致性。
核心功能:
sync.Map 或 LRU 缓存从 Redis 中加载的数据,减少对后端存储的直接访问,提升读取性能。该方案适用于需要快速读取、降低 Redis 压力并保证多实例间缓存一致性的场景,如用户状态缓存、配置中心等。
该代码实现了一个无锁队列(LockFreeQueue),适用于高并发环境下的线程安全队列操作。通过使用原子操作(atomic包)而非互斥锁,避免了锁带来的性能瓶颈和死锁风险。
核心机制:
CompareAndSwap 确保多协程并发访问时的状态一致性,实现无锁的 Push 与 Pop 操作。该设计适合用于对性能敏感、并发度高的场景,如网络数据包处理、任务调度器等。
该代码实现了一个并查集(Union-Find Set,也称不相交集合)数据结构,用于高效管理元素的分组问题,支持快速合并与查询操作。其核心特点是通过路径压缩和按秩合并优化,显著提升查找和合并的时间复杂度,接近常数级别。
主要功能:
该结构广泛应用于图的连通性判断、社交网络中的好友分组、图像处理中的连通区域识别等场景。
该代码库实现了一个通用排序算法集合,支持多种高效的排序方式。所有算法均使用 Go 泛型语法,适用于任何可比较类型(cmp.Ordered)的切片输入。
基数排序 (BaseSort)
堆排序 (HeapSort)
归并排序 (MergeSort)
快速排序 (QuickSort)
该代码库实现了一个通用的读写控制组件,包含多种策略以协调并发场景下的读写优先级。适用于需要对共享资源进行高效、安全访问的场景。
接口定义 (ReadWriter)
公平读写策略 (EquityReadWrite)
读优先策略 (ReadFirst)
写优先策略 (WriteFirst)
该代码库实现了一个通用的限流组件,包含多种限流策略以应对不同场景下的请求控制需求。所有实现均支持基于令牌(Token)、计数(Count)或时间窗口(Window)的限流算法,并结合本地与 Redis 实现分布式环境下的统一限流管理。
计数限流 (CountLimiter)
漏桶限流 (LeakyBucketLimiter)
令牌桶限流 (TokenLimiter)
滑动窗口限流 (WindowLimiter)
Redis 分布式限流
该组件适用于 API 网关、微服务、支付系统等需对访问频率进行精细化控制的场景。
该代码(github.com/cheerego/go-redisson)实现了一个基于 Redis 的分布式读锁(RLock),适用于多节点环境下对共享资源的并发控制。通过 Lua 脚本、Redis Hash 与 Pub/Sub 机制,确保了跨服务实例的互斥访问,并支持自动续期、阻塞等待和超时释放等高级特性。
加锁机制
HINCRBY 记录每个客户端的持有次数,实现可重入性。PEXPIRE)。waitTime)与持有时间(leaseTime),后者为 -1 表示启用看门狗自动续期。自动续期(Watchdog)
解锁机制
等待通知机制
可重入支持
高可用与异常处理
| 功能 | 描述 |
|---|---|
| 分布式支持 | 基于 Redis 实现跨节点一致性 |
| 可重入 | 同一客户端可多次获取锁 |
| 自动续期 | 支持 Watchdog 定时刷新锁超时时间 |
| 阻塞等待 | 提供 TryLock 支持带超时的阻塞加锁 |
| 异常恢复 | 断开连接或失败时能正确释放资源 |
| 公平唤醒 | 依赖 Redis Pub/Sub 实现唤醒机制 |
此实现适合作为构建强一致性分布式系统的基础设施之一,可用于替代或增强原生的 Redis 锁方案。
该代码库实现了一个高效的分布式序列号生成系统(Segment ID),适用于需要全局唯一、有序且高性能的 ID 分配场景。通过 Redis 缓存与底层数据库结合,支持高并发请求和故障恢复。
接口定义 (SeqDatabase)
缓存机制 (SeqCacheRedis)
适用于金融交易流水号、订单编号、日志追踪 ID 等需全局唯一且有序递增的业务场景。
该代码库实现了一个高性能缓存组件集合,包含多种主流缓存淘汰策略与统计结构,适用于需要高效内存管理、访问控制和热点数据识别的场景。
LFU(Least Frequently Used)lfu.go
LRU(Least Recently Used)lru.go
CountMin Sketch(CMS)cm_sketch.go
TinyLFU 与 Window TinyLFU(扩展预留)
Segmented LRU(扩展预留)
该代码库实现了一个 AC 自动机(Aho-Corasick Automaton),是一种高效的多模式匹配算法,适用于在一段文本中同时查找多个关键词的出现位置。整体结构清晰,支持插入、删除和匹配操作,适合敏感词过滤、日志关键字检索等场景。
AC 自动机结构 (ACAutomation)
构建 Trie 树 (insert / InsertMany)
构建失败指针 (buildFail)
模式匹配 (Match)
删除关键词 (Delete)
isEnd = false),保留结构供其他词使用。匹配结果结构 (MatchResult)
该代码库实现了三种常见的平衡二叉搜索树结构(AVL 树、Treap、支持分裂与合并的 Treap),适用于需要高效插入、删除、查找和遍历操作的场景。每种实现都提供了基本的树操作,并通过统一的测试用例验证其正确性。
AVL 树 (AVLTree)
Treap (Treap)
支持分裂与合并的 Treap (TreapWithSM)
该代码(sync.Pool)实现 Go 标准库中的 sync.Pool 结构,是一个用于临时对象的并发安全缓存池,旨在减少频繁创建和销毁对象带来的性能开销。适用于对象生命周期短、分配频繁、可复用性强的场景。
对象缓存与复用
线程局部(Per-P)缓存机制
pin() 将 goroutine 绑定到当前 P,确保缓存访问高效且线程安全。私有与共享队列
双阶段回收机制
自动清理与 GC 集成
并发安全
| 功能 | 描述 |
|---|---|
| 对象复用 | 存储并复用临时对象,降低内存分配压力 |
| 并发安全 | 多协程同时调用 Put/Get 安全 |
| 自动释放 | 对象可能在任意时间被清除(如 GC 期间) |
| 无锁设计 | 利用 per-P 缓存减少锁争用,提升性能 |
| 可扩展初始化 | 支持设置 New 函数用于按需生成新对象 |
fmt, io 等包使用的临时 buffer)此结构不适合用于长期存活对象或需要精确控制生命周期的场景,因其内容会在 GC 时被清空,也不适合做严格意义上的对象池(Object Pool)。
该代码(github.com/bytedance/gopkg/util/gopool)实现了一个高性能、可配置的协程池(gopool),适用于管理并限制并发执行任务的数量,避免资源耗尽问题。整体结构清晰,分为 worker 和 task 两部分,并结合对象复用机制提升性能。 核心组件
协程池接口 (Pool) 提供统一的任务提交与管理接口:
任务模型 (task)
执行单元 (worker)
内部任务调度机制
该代码(github.com/bytedance/gopkg/lang/mcache)实现了一个高效的字节缓冲区([]byte)缓存池 mcache,基于大小分级的 sync.Pool 实现,用于优化频繁创建和释放临时字节数组带来的性能损耗。
分级缓存
sync.Pool。内存分配 (Malloc)
cap(ret) >= cap。bytesHeader 结构体操作切片底层字段,提升性能。内存释放 (Free)
索引计算
初始化机制
dirtmake.Bytes 创建并封装为 *byte 存储。| 功能 | 描述 |
|---|---|
| 高性能缓存 | 基于 sync.Pool,避免频繁内存分配与 GC 压力 |
| 多级粒度 | 分为多个 2 的幂次方等级,适应不同大小请求 |
| 安全复用 | 提供统一接口用于获取和释放缓冲区,防止内存泄漏 |
| 并发安全 | 所有操作均线程安全,适用于高并发场景 |
| 内存对齐 | 只缓存容量为 2 的幂的缓冲区,便于管理与复用 |
netpoll(github.com/cloudwego/netpoll) 是一个基于 Go 实现的高性能网络通信库,其核心架构采用 主从 Reactor 模型(Main-Sub Reactor)和 协程池 + 零拷贝缓冲区机制,结合 epoll I/O 多路复用模型,实现了高效的并发网络处理能力。
netpoll 使用了经典的 主从 Reactor 架构:
主 Reactor(Main Reactor):
从 Reactor(Sub Reactor):
该设计使得连接管理与事件处理分离,提升了系统的可扩展性和性能。
netpoll 在处理连接的业务逻辑时使用了 轻量级的协程池机制:
此外,对于异步操作(如定时器、超时控制等),也利用 Go 的原生并发特性进行管理。
为了减少内存分配与 GC 压力,netpoll 使用了 链式零拷贝缓冲区(LinkBuffer)配合 字节池 来优化内存使用:
netpoll 中每个连接都包含两个缓冲区:
两者均实现了零拷贝接口:
这种设计显著减少了系统调用次数和内存拷贝,提高了吞吐性能。
netpoll 默认使用 Linux 下的 epoll I/O 多路复用模型:
epoll_ctl 注册文件描述符事件(EPOLLIN、EPOLLOUT 等)。epoll_wait 监听事件并分发到对应的 FDOperator。关键点包括:
此外,还使用了 eventfd 实现 Poll 的主动唤醒机制,确保主线程可以安全退出或重新调度。
| 模块 | 特性 |
|---|---|
| Reactor 模型 | 主从结构,主 Reactor 接收连接,子 Reactor 处理事件 |
| 协程池 | 利用 Go 协程实现轻量级任务调度,每个连接最多一个并发处理 |
| 字节池 | 使用 LinkBuffer 实现高效内存管理,减少 GC 开销 |
| 读写缓冲区 | 零拷贝 Reader/Writer,提升 IO 性能 |
| epoll 模型 | 基于 epoll 实现事件驱动、非阻塞 I/O 和边缘触发机制 |
整体来看,netpoll 通过上述技术组合,构建了一个高性能、低延迟、高并发的网络通信框架,适合构建大规模分布式服务。