Redis底层设计与源码分析(一)__底层数据结构逻辑分析

news/2024/11/23 23:35:41/

前言 

最近在工作中接触redis,但实际应用不多,可用场景也不是很明确,所以想借机多多学习下redis相关知识,一下内容都是通过自己找资源学习之后归纳总结的知识,若有相关错误点,请指正。

一、redis介绍

1.redis为什么效率很高

1)高速的存储介质,redis内容就是存储在内存条中

 2)优良的底层数据结构

 3)高效的网络IO模型

 

4)高效的线程模型

二、redis的底层数据结构说明

问题一:redis底层得数据结构是怎样得呢?

答:

在redis底层采用的数据结构是HashTasble方式,HashTasble就是一个数组,我们把redis一个键值对数据称为数据对象entry,那么HashTasble存放的是各个entry的索引,那么这个索引值是怎么得出来的呢?它是对entry中的key值进行求hash值(hash函数),再将hash值进行求模得出索引值,公式如下:hash(key) % hashTable.size = 索引值                                                                   得到得这个索引值会指向entry,即存储具体得键值对数据。

问题二:通过hash求值得到得索引会存在经典得hash碰撞问题即不同得输入也可能会得到相同得hash值,那么就会导致不同得key所处得hashtable位置相同。在redis中是如何避免这种问题得呢?

答:

redis中所存储得entry,不仅仅有key、value两个值,还有next,用来存储下一个entry得指向,当遇到hash冲突时候redis就会将值放在已有entry得next中,形成链表结构,链表增加元素有两种方式,其一:可以放在链表头,称为头插法,如下:

 

其二:可以放在链尾,称为尾插法,如下:

 而redis采用得便是头插法,原因是为了更快得访问到元素。

问题三:正因为hash冲突得存在,就会使得链表得元素变多,就会使得元素访问变慢,那么redis是如何避免解决这样的问题呢?

答:

在redis中是这样避免链表中元素过多而导致元素检索变慢得。当元素entry个数大于hashtable.size时,redis就会进行扩容,扩容得倍数是原来得一倍,即原来hashtable.size=11,扩容之后新的hashtable.size=22,那扩容之后有了空间就需要进行元素得迁移,即rehash。

当键值对过多时,一次性移动所有键值对会导致Redis在一段时间内无法对外提供服务,所以redis采用得是渐进式 rehash,redis扩容之后便有两个hashtable,原hashtable成为hashtable[0],长度为11,另一个hashtable称为hashtable[1],长度为22,每次对redis执行增删改查操作时,程序在执行指定操作之外,还会将 hashtable[0] 在 rehashidx 索引上的所有键值对,依据hashtable[1]得大小进行重新计算索引位置,然后rehash 到 hashtable[1],之后将 rehashidx 的值加一;rehashidx初始为0,全部迁移完成之后rehashidx便设为-1,并释放hashtable[0]空间。

特别的,在渐进式 rehash 操作过程中,因为同时存在两个哈希表,所以对redis的删除,查找,更新操作会在两个哈希表上进行。程序会先尝试在 ht[0] 中寻找目标键值对,如果没有找到则会在 ht[1] 再次进行寻找,然后进行具体操作。但是新增操作只会在 ht[1] 上进行,这保证了 ht[0] 中的已经被清空的单向链表不会新增元素。

详细得源码分析看《Redis底层设计与源码分析(二)__底层数据结构源码分析》


http://www.ppmy.cn/news/59563.html

相关文章

Linux_top命令

top命令是Linux系统下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。它是一个动态显示过程,执行该命令后,它展示的信息会将独占前台,直到用户终止该程序为止(可以用Ctrl C终止)。 t…

Ubuntu 如何查看 CPU 架构、系统信息、内核版本、版本代号?

Ubuntu 查看 CPU 架构、系统信息、内核版本、版本代号等相关信息有很多方式,本文介绍几种常用的命令。 x86 架构与 ARM 架构的 CPU 架构不同,如果回显为 aarch64 表示为 ARM 架构,如果回显为 x86_64 表示为 x86 架构,参考《CPU 架…

在制造业的工业2.0中应用MOM系统

介绍 什么是制造运营管理 (MOM) 系统和 IT 架构的最佳实践? 行业专家对制造类型和供应网络有何建议? 管理思维和企业文化是否因不断变化的全球市场而过时? MOM 技术是否过于昂贵,IT 架构是否无法快速适应市场变化?…

测试开发备战秋招面试6-牛客刷题二分查找/排序篇

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧! 目录 1、二分查找-I 2、二维数组的查找 3、寻找峰值 …

新形势下,如何进行智慧园区移动应用建设?

智能化工园区通过信息化实现工业管理的数字化和网络化,实现对生产过程的全面监控和实时数据采集。这使企业能够更好地管理,及时发现问题并采取相应的措施来降低成本。此外,智慧化管理提高了企业资源的使用效率,避免浪费和重复利用…

JavaScript:数组---双指针法

文章目录 双指针法27.移除元素为什么返回值是整数,但输出的答案是数组?双指针法 977.有序数组的平方暴力法:先平方再排序双指针法 总结双指针 双指针法 27.移除元素 为什么返回值是整数,但输出的答案是数组? 双指针法…

c++ 入门概述

c 入门概述 1. c 关键字2. c 命名空间3. c 输入与输出4. c 缺省参数5. c 函数重载6. c 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用与指针区别 7. c 内联函数8. c auto 关键字9. 范围 for 循环 1. c 关键字 c 98中,规定的关键字总共有63个: 2. c…

Java时间类(三) -- Calendar()(日历类)

java.util.Calendar类是一个抽象类,它提供了日期计算的相关功能、获取或设置各种日历字段的方法。 protected Calendar() 构造方法为protected修饰,无法直接创建该对象。1. Calendar()的常用方法: 方法名说明static Calendar getInstance()使用默认时区和区域获取日历vo…