在Linux内核中,哈希表管理着进程和连接,而Redis却选择跳表实现有序集合。同样是高效数据结构,为何不同场景下有如此差异?
1. 引言:从两个实际案例说起
在深入技术细节之前,先看两个经典案例:
案例一:Linux内核的进程管理
Linux内核需要管理成千上万的进程,并需要根据进程ID快速查找到对应的进程描述符(task_struct
)。内核采用了哈希表来实现这一功能,通过PID的哈希值直接定位到对应的进程,实现了O(1)时间复杂度的查找。
案例二:Redis的有序集合
Redis是一个高性能的内存数据库,其有序集合(Sorted Set)需要支持高效的范围查询(如查询分数在80-90之间的所有成员)。Redis选择了跳表(Skip List)作为底层实现之一,因为它可以在O(log n)时间复杂度内完成范围查询。
同样是高效的数据结构,为什么Linux内核选择哈希表,而Redis选择跳表?这正是本文要深入探讨的问题。
2. 核心概念与工作原理
2.1 哈希表(Hash Table):基于随机访问的"字典"
哈希表是一种通过哈希函数将键(Key)映射到表中位置来访问记录的数据结构。它的核心思想是"分配"策略。
工作原理:
-
对键进行哈希计算,得到哈希值
-
通过哈希值定位到数组中的桶(Bucket)
-
在桶