redis源码阅读--hashTable
为什么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相关推荐
- Redis源码阅读-Adlist双向链表
Redis源码阅读-链表部分- 链表数据结构在Adlist.h Adlist.c Redis的链表是双向链表,内部定义了一个迭代器. 双向链表的函数主要是链表创建.删除.节点插入.头插入.尾插入. ...
- redis源码阅读-持久化之RDB
持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...
- redis源码阅读-zset
前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...
- redis源码阅读-持久化之aof与aof重写详解
aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...
- redis 源码阅读
双向链表(adlist.h/adlist.c) - redis 源码解析 1.0 documentation (redissrc.readthedocs.io) 如何阅读 Redis 源码? - bl ...
- Redis源码阅读,从入门到放弃
作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...
- Redis源码阅读01-读了一下redis启动流程涉及的源码我都读了个啥
阅读源码是学习一门技术的必经之路,经过1周左右的c语言入门学习,我就开始硬读redis的源码了.因为公司的多版本的改造,所以源码就选择redis6.x的最高版本redis6.2.7. 在阅读源码前,首 ...
- redis源码阅读(1)
redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...
- Redis源码阅读笔记(1)——简单动态字符串sds实现原理
首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...
最新文章
- Spring5源码 - 14 如何在所有Bean创建完后做扩展?
- 转贴:BMP格式详解 二 (转载)
- AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
- 【软考-软件设计师】计算机体系结构的分类
- oracle使用唯一结果集,oracle分页查询结果集重复问题解决方法
- 移动端功能测试需要注意的点
- 简述驱动桥的动力传递路线_卡车驱动桥中的差速锁究竟有多大的作用?它是如何起作用的?...
- 03Prism WPF 入门实战 - Region
- [js] 一个api接口从请求数据到请求结束共与服务器进行了几次交互?
- c语言实现各种排序,c语言实现各种排序算法
- MySql表以及数据导入导出
- mac 上mysql怎么卸载不了_mac上mysql怎么卸载不了
- 2021年全球及中国企业级路由器市场竞争格局分析,呈现出寡头竞争的市场格局「图」
- 加密系列 | SHA加密和解密算法详解代码示例
- MYSQL的基础命令一
- shiro加盐走源码
- vue简单购物车结算计算总价
- 华为开源数据库openGauss
- week67(2021.10.23-2021.11.5)
- 使用再生龙制作linux系统镜像及还原,使用再生龙(clonezilla)还原盘制作系统恢复镜像并恢复安装...