为什么80%的码农都做不了架构师?>>>   

公司有个项目用到hash,同事从redis的代码里抠了hashTable的源码出来,最近抽空看了一下,设计还是很精妙的。 现在把阅读的结果写写,以备后面复习可用(记得之前看过一次,后来长时间没看了就忘记了,这次再看基本要从头开始)

源码位置

  • dict.h
  • dict.c

图示

(摘自redis设计与实现) 参考这里

设计思路

  • 这个hash(字典)他包含了两个table,为什么有两个呢?那是因为他要实现自动扩展,每次要add新元素的时候都要 判断一下是否需要扩展(expand)
  • 两个table再挂上2的倍数(size) 的桶,每个桶都是一个链表。
  • 当达到条件需要扩展的时候,一般是元素的个数和桶的比例差不多是1:1, 那就将第一个table生成第一个的size *2 为什么要是2的倍数呢?有几个好处:1.分布更均匀 2.碰撞几率更小 但是还有一个更重要的原因是: a%b可以替换成了a&(b-1) ,当hashtable的长度是2的幂的情况下。这样运算速度可以提高很多,具体可以参考这里
  • 当新的table生成后,桶数扩大了一倍,这样就大大地减少了碰撞,但是就带来了一个原来的数据是rehash的问题
  • 当rehash开始后,如果有增,删,查的操作,每次都搬一个桶到新的table上,如果已经开始rehash,那么,新增的元素就直接插到新的桶上
  • 当rehash全部完成后,旧talbe释放掉,新table接替旧table成为主力工作。
  • 还给hash设置了迭代器(iterators), 当有迭代器存在的时候,为了安全就不进行rehash的步骤。

参考资料

  • 为啥要用位运算代替取模呢
  • 图解redis之数据结构篇

转载于:https://my.oschina.net/mawx/blog/893393

redis源码阅读--hashTable相关推荐

  1. Redis源码阅读-Adlist双向链表

    Redis源码阅读-链表部分- 链表数据结构在Adlist.h   Adlist.c Redis的链表是双向链表,内部定义了一个迭代器. 双向链表的函数主要是链表创建.删除.节点插入.头插入.尾插入. ...

  2. redis源码阅读-持久化之RDB

    持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...

  3. redis源码阅读-zset

    前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...

  4. redis源码阅读-持久化之aof与aof重写详解

    aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...

  5. redis 源码阅读

    双向链表(adlist.h/adlist.c) - redis 源码解析 1.0 documentation (redissrc.readthedocs.io) 如何阅读 Redis 源码? - bl ...

  6. Redis源码阅读,从入门到放弃

    作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...

  7. Redis源码阅读01-读了一下redis启动流程涉及的源码我都读了个啥

    阅读源码是学习一门技术的必经之路,经过1周左右的c语言入门学习,我就开始硬读redis的源码了.因为公司的多版本的改造,所以源码就选择redis6.x的最高版本redis6.2.7. 在阅读源码前,首 ...

  8. redis源码阅读(1)

    redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...

  9. Redis源码阅读笔记(1)——简单动态字符串sds实现原理

    首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...

最新文章

  1. Spring5源码 - 14 如何在所有Bean创建完后做扩展?
  2. 转贴:BMP格式详解 二 (转载)
  3. AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
  4. 【软考-软件设计师】计算机体系结构的分类
  5. oracle使用唯一结果集,oracle分页查询结果集重复问题解决方法
  6. 移动端功能测试需要注意的点
  7. 简述驱动桥的动力传递路线_卡车驱动桥中的差速锁究竟有多大的作用?它是如何起作用的?...
  8. 03Prism WPF 入门实战 - Region
  9. [js] 一个api接口从请求数据到请求结束共与服务器进行了几次交互?
  10. c语言实现各种排序,c语言实现各种排序算法
  11. MySql表以及数据导入导出
  12. mac 上mysql怎么卸载不了_mac上mysql怎么卸载不了
  13. 2021年全球及中国企业级路由器市场竞争格局分析,呈现出寡头竞争的市场格局「图」
  14. 加密系列 | SHA加密和解密算法详解代码示例
  15. MYSQL的基础命令一
  16. shiro加盐走源码
  17. vue简单购物车结算计算总价
  18. 华为开源数据库openGauss
  19. week67(2021.10.23-2021.11.5)
  20. 使用再生龙制作linux系统镜像及还原,使用再生龙(clonezilla)还原盘制作系统恢复镜像并恢复安装...

热门文章

  1. shell脚本if中判断大于、小于、等于、不等于的符号
  2. shell 判断字符串最后一个字符
  3. Nmap配合Masscan实现高效率扫描资产
  4. 前端笔记之ES678WebpackBabel(上)初识ES678Babellet和const解构语法
  5. 围绕央行系统升级所产生的常见问题
  6. 基于html5背景图片自适应代码
  7. 龙芯处理器可以适配鸿蒙os吗,SylixOS龙芯1C适配总结
  8. 一个HTTP请求,把网站打裂开了!
  9. 工作这几年,同事对我的称呼肉眼可见的在变化着......
  10. 程序员到底会不会修电脑?