redis hashtable 的sizemask理解

在 Redis 的哈希表实现中,index = hash & dict->ht[0].sizemask 是计算键值对应存储位置的核心操作。这个操作看起来简单,但背后涉及哈希表的内存布局和性能优化策略。我们通过以下步骤逐步解析其原理:


一、哈希表的设计目标

  1. 快速定位桶(Bucket):通过键的哈希值直接找到对应的存储位置,时间复杂度接近 O(1)。
  2. 均匀分布键值对:减少哈希冲突,避免链表过长导致性能下降。
  3. 高效计算:避免使用耗时的取模运算(%)。

二、哈希表大小(size)的特殊性

Redis 的哈希表大小 size 始终是 2 的幂(如 4, 8, 16, 32 等)。这种设计有两个关键优势:

  1. 快速计算索引:用位运算(&)替代取模运算(%)。
  2. 均匀分布哈希值:减少哈希冲突的概率。

三、sizemask 的作用

定义sizemask = size - 1
二进制特征:当 size 是 2 的幂时,sizemask 的二进制形式为全 1。
例如:
size = 8sizemask = 7 → 二进制 0111
size = 16sizemask = 15 → 二进制 1111


四、索引计算原理

1. 取模运算的替代方案

传统哈希索引计算使用取模运算:

index = hash % size; // 例如 hash=10, size=8 → index=2

但取模运算在计算机中效率较低(涉及除法操作)。

2. 位运算优化

size 是 2 的幂时,可以用位运算替代:

index = hash & (size - 1); // 即 hash & sizemask

为什么这等价于取模?
• 因为 size 是 2 的幂,size - 1 的二进制形式为全 1(例如 size=8 对应 sizemask=7,二进制 0111)。
hash & sizemask 相当于保留哈希值的低 n 位(n = log2(size)),结果范围是 0 ≤ index < size,与 hash % size 等价。


五、具体示例

假设哈希表大小 size = 8(即 sizemask = 7),哈希值 hash = 10

步骤二进制表示结果
hash = 10101010
sizemask = 701117
hash & sizemask1010 & 0111 = 00102

结果与 10 % 8 = 2 完全一致,但位运算比取模运算快得多。


六、哈希表扩容时的行为

当哈希表需要扩容(例如从 size=8 扩容到 size=16):

  1. sizemask = 15(二进制 1111
  2. 哈希值相同的键会分散到更多桶中
    • 例如原哈希值 10(二进制 1010)在 size=8 时索引为 2
    • 扩容后 size=16,索引变为 10 & 15 = 10

七、为什么必须保证 size 是 2 的幂?

如果 size 不是 2 的幂,sizemask 的二进制形式将包含 0,导致部分索引永远无法被映射到。
例如:
size = 7sizemask = 6(二进制 0110
• 哈希值 5(二进制 0101)→ 0101 & 0110 = 0100(索引 4)
• 哈希值 3(二进制 0011)→ 0011 & 0110 = 0010(索引 2)
索引 1、3、5、7 永远无法被访问,导致哈希分布不均。


八、性能对比

操作类型指令周期(近似)适用场景
位运算(&1 cycle快速计算
取模运算(%10-20 cycles通用计算

在 Redis 这种高性能场景下,位运算的优势显著。


九、总结

sizemask = size - 1:当 size 是 2 的幂时,此公式成立。
hash & sizemask:快速计算键的存储位置,避免取模运算。
设计优势:内存对齐、哈希均匀、计算高效。

这种设计是 Redis 哈希表高性能的核心保障,结合渐进式 rehash 机制,使得 Redis 能够高效处理大规模键值对存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ruby 命令行选项

Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

Java 数据库连接池

HikariCP 老外开源的。 Spring Boot 2 之后默认选择的连接池。 号称性能最快的数据库连接池。 为什么性能好呢&#xff1f; ● 字节码级别的优化-尽量的利用 JIT 的内联手段 ● 字节码级别的优化-利用更容易被 JVM 优化的指令 ● 代码级别的优化-利用改造后的 FastList 代替…

Spring Boot中@Valid 与 @Validated 注解的详解

Spring Boot中Valid 与 Validated 注解的详解 引言Valid注解功能介绍使用场景代码样例 Validated注解功能介绍使用场景代码样例 Valid与Validated的区别结论 引言 在Spring Boot应用中&#xff0c;参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能扩展说明&#xff1a; 图类封装&#xff1a;将图数据结构封装为类&#xff0c;提高代码复用性 最短路径查找&#xff1a;基于BFS实现未加权图的最短路径查找 路径重构&#xff1a;通过parent数组回溯构建完整路径 异常处理&#xff1a;当路径不存在时返回空向量 复杂度分析…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

sqlalchemy:将mysql切换到OpenGauss

说明 之前python的项目使用的mysql&#xff0c;近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;测试下来发现不用改代码&#xff0c;只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在&#xff1a;https:…

uniapp 获取dom信息(封装获取元素信息工具函数)

在uniapp开发中&#xff0c;需要获取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的时候都需要很长一段的繁琐代码&#xff0c;本篇文章将呈现获取dom信息方法封装&#xff0c;话不多说&#xff0c;上菜&#xff1…

Linux之数据链路层

Linux之数据链路层 一.以太网1.1以太网帧格式1.2MAC地址1.3MTU 二.ARP协议2.1ARP协议工作流程2.2ARP协议格式 三.NAT技术四.代理服务4.1正向代理4.2反向代理 五.四大层的学习总结 一.以太网 在我们学习完了网络层后我们接下来就要进入数据链路层的学习了&#xff0c;在学习完网…

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数&#xff08;如下&#xff09;&#xff1a; 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

全新版租赁商城小程序源码系统 源码开源支持二开+图文搭建教程

在互联网商业的浪潮中&#xff0c;租赁业务凭借其独特的优势&#xff0c;正逐渐成为市场的新宠。对于开发者而言&#xff0c;快速搭建一个功能完备的租赁商城小程序&#xff0c;不仅能满足市场需求&#xff0c;还能为自己的业务拓展带来新的机遇。分享一款全新版租赁商城小程序…

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…

OSI 七层模型和四层模型(TCP/IP 模型)

文章目录 前言一、OSI 七层模型二、TCP/IP 四层模型三、运行协议及设备1. OSI 七层模型2. TCP/IP 四层模型3. 运行协议4. 各类设备的作用 总结 前言 OSI 七层模型和四层模型&#xff08;TCP/IP 模型&#xff09;是两种常见的网络协议分层架构&#xff0c;它们的主要区别如下&a…

AI的未来:机遇、挑战与发展方向

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 人工智能&#xff08;AI&#xff09;已经成为当今世界最具革命性的技术之一&#xff0c;它正在深刻改变各个行业&#x…

javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。

大白话javascript实现一个函数&#xff0c;将字符串中的指定子串全部替换为另一个字符串的原理&#xff0c;以及多种方法实现。 在JavaScript里&#xff0c;要是你想把字符串里的指定子串都替换成另外一个字符串&#xff0c;有不少方法可以实现。下面我会详细介绍实现的原理&a…

硬件基础--16_公式梳理

公式梳理 欧姆定律: IU/R 1.欧姆定律有局限性&#xff0c;仅适用于纯电阻电路(或者说纯电阻元器件&#xff0c;纯电阻设备) 2.纯电阻电路:消耗的电能仅转化为热能&#xff0c;没有其他形式的能量转换。 功率计算:PUI 1.导出公式:PU2 /R 2.导出公式:PI2 R 焦耳定律:QI2 Rt 1.导…

npm i 出现的网络问题

npm i 出现的网络问题 解决方案&#xff1a; npm config list 查看.npmrc文件中是否配置了proxy删除.npmrc文件中的proxy&#xff0c;保存。重新执行npm i命令。 顺便说说解决这个问题的心里路程 每次安装vue的环境的时候&#xff0c;经常遇到npm安装一些插件或者是依赖的时…

使用vue cli 5.0 在vscode中运行vue命令报错

1、运行 vue -- version 报错 2、在cmd 命令行 执行 vue --version 正常 3、在终端中输入 get-ExecutionPolicy&#xff0c;查看当前权限 4、执行 set-executionpolicy remotesigned 命令设置为可用模式&#xff0c;但是报错 5、使用管理员打开power shell 执行 G…

瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记

一、源码 官方在librga中给了很多 demo 以供参考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…