"); //-->
本文分享自天翼云开发者社区《redis渐进式rehash》,作者:l****n
Redis是k-v型数据库,其内部设计了一种dict类型的数据结构用来存储键值结构。
dict 通常的存储结构是 Key-Value 形式的,通过 Hash 函数对 key 求 Hash 值来确定 Value 的位置,因此也叫 Hash 表,是一种用来解决算法中查找问题的数据结构,默认的算法复杂度接近 O(1)。
使用哈希表总是会遇到哈希碰撞问题,dict使用拉链法将发生碰撞的元素组成链表,挂在发生碰撞的桶下,但是随着存储元素的不断增加,碰撞发生的几率也不断增大,一个桶下链接的链表长度越来越长,定位一个key的时间复杂度就无法保证了,redis作为内存数据库,本身追求的是更高的处理性能,线性增加的耗时无疑是不能接受的,为了减少hash碰撞,需要创建一个更长的hash表,让元素能够均匀的分布在hash表上。
所以,Dict内部定义了两个hashtable,分别是dictht[0]和dictht[1],元素数量不多时,dict只在dictht[0]上存储元素,dictht[1]不分配空间。当dictht[0]的元素个数达到一定数量,会触发扩容过程,让dictht[1]指向一个2倍长度的空间,然后进行rehash, 将dictht[0]上的元素重新映射到dictht[1]上。
如果dictht[0]上有很多元素,进行rehash无疑是一个很耗时的过程,加上redis是单线程,如果想一次完成rehash,就会很长时间的阻塞业务,所以redis选择渐进式rehash。每次dictht[0]收到一个请求,只会将一个索引上的链表进行重新映射。
在将数据拷贝至dictht[1]时,dictht[0]仍然对客户端提供服务。Rehash期间,如果有新的插入元素请求时,直接将元素插入到dictht[1]中,有客户端查询请求到来, 按照dictht[0]->dictht[1]的顺序依次进行查询。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
Empress嵌入式数据库简介
基于无线通信的自动抄表系统的
Yandex 在 GitHub 开源 YDB 数据库
在vxworks做一个内存数据库,请各位大虾指点?(老站转)
嵌入式实时数据库
一种基于SQL语句分发请求的复制算法
嵌入式数据库
基于大数据分析的实体导航系统
智能停车场一体化控制器方案简述
业界唯一的全球OSAT制造站点数据库报告包括覆盖到测试的360条产线
中国关系型数据库软件市场,变革即将到来
嵌入式Linux开发之C语言学习秘诀
基于Onenet及微信小程序的校园运动场地预约系统
实时数据库系统及其特征(老站转)
嵌入式数据库
安全升级,智能领航:RFID技术推动铁路锁控系统进入新时代
基于二维激光脉冲测距传感器的动态车辆智能宽高检测系统设计
面向对象数据库在多机器人系统中的应用研究
中国信通院公布上半年国内数据库产品和服务商第一梯队,含华为、阿里、腾讯
四个步骤 获得更安全数据库
详细讲解大型数据库的设计原则与开发技巧
电冰箱及其部件自动检测线设计与实现
基于实时分布式数据库的轨道交通电力监控系统
印度拟建立大规模人脸识别系统
Protel99SE的文件管理