96SEO 2026-02-19 09:17 16
chaining)来解决键冲突#xff0c;每个哈希表节点都有一个next指针#xff0c;多个哈希表节点可以…字典

当有两个或以上数量的键被分配到了一个哈希表数组的同一个索引上面我们称这些键发生了冲突(collision)。
chaining)来解决键冲突每个哈希表节点都有一个next指针多个哈希表节点可以用next指针构成一个单向链表被分配到同一个索引上的多个节点可以用这个单向链表连接起来这就解决了键冲突的问题。
冲突的办法就是使用next指针将键K2和K1所在的节点连接起来
因为dictEntry节点组成的链表没有指向链表表尾的指针所以为了
速度考虑程序总是将新节点添加到链表的表头位置(复杂度为O(1)),
随着操作的不断执行哈希表保存的键值对会逐渐地增多或者减少为了让哈希表的负载因子(load
factor)维持在一个合理的范围之内当哈希表保存的键值对数量太多或者太少时程序需要对哈希表的大小进行相应的扩展或者收缩。
扩展和收缩哈希表的工作可以通过执行rehash(重新散列)操作来完成Redis对字典的哈希表执行rehash的步骤如下:
1.为字典的ht[1]哈希表分配空间这个哈希表的空间大小取决于要执行的操作以及ht[0]当前包含的键值对数量(也即是ht[0].used属性的值):1.1
如果执行的是扩展操纵那么ht[1]的大小为第一个大于等于ht[0].used
如果执行的收缩操作那么ht[1]的大小为第一个大于等于ht[0].used的2^n2.将保存在ht[0]中的所有键值对rehash到ht[1]上面:rehash指的是重新计算键的哈希值和索引值然后将键值对放置到ht[1]哈希表的指定位置上。
3.当ht[0]包含的所有键值对都迁移到了ht[1]之后(ht[0]变为空表),释放ht[0]将ht[1]设置为ht[0]并在ht[1]新创建一个空白哈希表为下一次rehash做准备。
8而8(2^3)恰好是第一个大于等于4的2的n次方,所以程序会将ht[1]哈希表的大小设置为8.
2.将ht[0]包含的四个键值对都rehas到ht[1]如图所示
3.释放ht[0]并将ht[1]设置为ht[0]然后为ht[1]分配一个空白哈希表如图所示。
至此对哈希表的扩展操作执行完毕程序成功将哈希表的大小从原来的4改为了现在的8
当以下条件中的任意一个被满足时程序会自动开始对哈希表执行扩展操作:
1.服务器目前没有在执行BGSAVE命令或者BGREWRITEAOF命令并且哈希表的负载因子大于等于12.服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令并且哈希表的负载因子大于等于5
根据BGSAVE命令或BGREWRITEAOF命令是否正在执行服务器执行扩展操作所需的负载因子并不相同这是因为在执行BGSAVE命令或BGREWRITEAOF命令的过程中Redis需要创建当前服务器进程
的子进程而大多数操作系统都采用写时复制(copy-on-write)技术来优化子进程的使用效率所以在子进程存在期间服务器会提高执行扩展操作所需的负载因子从而尽可能地避免在子进程存在期间进行哈希表扩展操作这可以避免不必要地内存写入操作最大限度地节约内存。
另一方面当哈希表地负载因子小于0.1时程序自动开始对哈希表执行收缩操作
例如对于一个大小为4包含4个键值对的哈希表来说这个哈希表的负载因子为load_factor
1;例如对于一个大小为512包含256个键值对的哈希表来说这个哈希表的负载因子是:load_factor
扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面但是这个rehash动作并不是一次性、集中式地完成而是分多次、渐进式地完成的。
这样做的原因在于如果ht[0]里只保存着四个键值对那么
服务器可以在瞬间就将这些键值对全部rehash到ht[1]但是如果哈希表里保存的键值对数量不是四个而是四百万、四千万甚至四亿个键值对那么要一次性将这些键值对全部rehash到ht[1]的话庞大的计算量
可能会导致服务器在一段时间内停止服务。
因此为了避免rehash对服务器性能造成影响服务器不是一次性将ht[0]里面地所有键值对全部rehash到ht[1]而是分多次、渐进式地将ht[0]里面地键值对慢慢地rehash到ht[1]
1.为ht[1]分配空间让字典同时持有ht[0]和ht[1]两个哈希表
2.在字典中维持一个索引计数器变量rehashidx,并将它的值设置为0表示rehash工作正式开始
3.在rehash进行期间每次对字典执行添加、删除、查找或者更新操作时程序除了执行指定的操作以外还会顺带将ht[0]哈希表在rehashidx索引上的所有键值对rehash到ht[1]当rehash工作完成之后程序将
4.随着字典操作的不断执行最终在某个时间点上ht[0]的所有键值对都会被rehash至ht[1]这时程序将rehashidx属性的至设为-1表示rehash操作已完成。
渐进式rehash的好处在于它采取分而治之的方式将rehash键值对所需的计算工作均摊到对每个添加、删除、查找、
渐进式rehash执行期间的哈希表操作因为在进行渐进式rehash的过程中字典会同时使用ht[0]和ht[1]两个哈希表所以在渐进式rehash进行期间字典的删除、查找、更新等操作会在两个哈希表上进行。
例如要在字典里面查找一个键的话程序会在ht[0]里面进行查找如果没有找到的话就会继续到ht[1]里面进行查找诸如此类。
另外在渐进式rehash执行操作期间新添加到的字典的键值对一律会被保存到ht[1]里面而ht[0]则不再进行任何添加操作这一措施保证了ht[0]包含的键值对数量会只减不增并随着rehash操作的执行而最终变成空表
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback