redis 存储结构原理 1

news2025/1/20 6:00:22

关于 redis 相信大家都不陌生了,之前有从 0 -1 分享过 redis 的基本使用方式,用起来倒是都没有啥问题了,不过还是那句话,会应用之后,我们必须要究其原理,知其然知其所以然

今天我们来分享一下关于 redis 的存储结构的原理

redis 的存储结构的原理

我们都知道 redis 是一个 K-V 内存数据库,类似于 memcache ,那么一般存储这种 K-V 键值对的数据结构是什么呢?

红黑树 , 那么我们对于红黑树的增删改查的时间复杂度是 O(logN),对于红黑树而言,只要内存足够,那么这个 N 是可以无限大的

这对于 redis 来说是没有办法满足 redis 的需求,那么我们是否可以将复杂度降低到 O(1) 呢,感兴趣的,我们可以来探索一下?

hash 表

能满足 O(1) 时间复杂度的数据结构有啥呢?我们是不是可以想到 hash 表

具体 hash 表是怎样的一种结构,前面有文章已经分享过一些,redis 基础性的数据结构可以查看历史文章:【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步

redis 的 key 支持哪些类型?

redis 支持的 key 有:

  • long
  • double
  • int
  • string - 可见的字符串和二进制字符串,key 都是 string 类型

实际上最终到 redis 处理的时候,上述类型,都是对应按照 sring 类型进行存储的

这个 key 是有规律的 key,并且是强随机性的

redis 的 value 支持哪些类型?

  • string
  • list
  • set
  • zset
  • hash
  • Geospatial 地理位置
  • Hyperloglog 基数统计
  • Bitmap 位图场景

我们知道 O(1) 的索引时间复杂度数组就是一个很好的例子,我们访问数组元素的时候,直接通过下标访问即可

那么对应 hash 表,其实就是 数组 + hash 函数 来进行处理的,数组的下标索引就是 hash 函数 对 key(字符串) 进行 hash 算法计算出来的一个整数

例如这样

通过 hash 函数计算出来的整数是一个 64 位 的整型

hash 冲突

使用上述 hash 表的话,肯定会出现 hash 冲突,hash 冲突是什么样的效果呢?

就向上面的对 key (是一个各种组合的字符串),进行 hash 计算之后,得到一个整型的值,这个值是 64 位的整型

这也就意味着, key 的字符串组合是无限的,但是 64 整型的大小是固定的,总有有机会字符串计算出来的整数是会重复的,这个时候就出现了 hash 冲突

咱们可以举一个类型的形象例子:

假如说有 3 个盒子,4 个苹果,苹果要装在盒子里面,那么至少有一个抽屉是会放 2 个苹果,图下图所示,那么放 2 个苹果的这个抽屉就出现了 hash 冲突,就需要解决

例如放到我们的 hash 表中,数组大小我们设定了长度为 3,那么所有的整数我们都要对 3 取余,然后就结果对号入座

解决 hash 冲突

根据上述情况,出现了 hash 冲突,我们需要如何处理呢,如何才能解决 hash 冲突?

解决冲突的方式:

  • 使用链表,也就是链地址法 , 数组 + 链表的 方式

将出现冲突的元素,插入到以原有冲突元素作为链表头的链表中,使用头插法

一般是使用头插法这是遵循缓存淘汰算法的逻辑原理 LRU

数据库也是使用的头插法,表示新插入的数据,是最近就要使用的

  • 再使用一个 hash 函数来进行计算,得出另一个值,这是 再 hash 法
  • 再加一个数组来存放冲突的数据(这种方式不太好)

原有数组的每一个坑占一个放一个萝卜,如果有冲突出现,那么就把出现冲突的元素放到冲突数组中,并记下他所在冲突数组的索引位置,这个比较麻烦,不可持续

扩容和缩容

那么当咱们数据量比较大的时候,发生 hash 冲突的情况就会比较多,若大部分时间都是去解决冲突了,那么非常低效的,因此需要扩容

扩容的原则又是如何扩容的呢?

扩容的时候是,当持久化的数据量大于数组长度的时候,就会进行翻倍的扩容,例如上述 数组长度为 3 ,当我们有 4 个 或者 5 个数据的时候,数组的长度会扩到 6,12, 24 … 这样的来进行翻倍扩容

那么 缩容的时候,是不是也是要进行翻倍缩容的?

我们可以来看看效果,如果是翻倍缩容的话

如果是翻倍缩容的话,就会出现这么一个情况,原有数组长度为 4,如果数据变成 5 个,就会翻倍扩容数组长度为 8,如果数据又变回 4 个,那么数组长度又会翻倍缩容到长度为 4

就会出现上述的这类情况,可能会存在一会扩容,一会缩容,这是非常消耗资源和性能和,因此定了一个数据是 当数据量小于数组长度的 10% 的时候,会进行缩容

本次暂且分享这么多,下一部分分享具体的 hash 表在 redis 中的数据结构,和具体的实现方式

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

【网络基础实战之路】VLAN技术在两个网段中的实际应用详解

系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…

Matplotlib数据可视化(五)

目录 1.绘制折线图 2.绘制散点图 3.绘制直方图 4.绘制饼图 5.绘制箱线图 1.绘制折线图 import matplotlib.pyplot as plt import numpy as np %matplotlib inline x np.arange(9) y np.sin(x) z np.cos(x) # marker数据点样式,linewidth线宽,li…

揭开区块链地址背后的故事,你需要知道的KYA

作者|Jason Jiang 在区块链世界中,除了交易还有另一个基础要素:地址。在欧科云链日前推出的Onchain AML合规技术方案,也有一个与区块链地址密切相关的概念:KYA(Know Your Address,了解你的地址&…

[LitCTF 2023]Ping

因为直接ping会有弹窗。这里在火狐f12,然后f1选禁用javascript,然后ping 然后输入127.0.0.1;cat /flag 得到flag, 查看其他大佬的wp ,这里还可以抓包。但是不知道为什么我这里的burp 用不了

数字化转型能带来哪些价值?_光点科技

随着科技的迅猛发展,数字化转型已成为企业和组织的一项重要战略。它不仅改变了商业模式和运营方式,还为各行各业带来了诸多新的机遇和价值。在这篇文章中,我们将探讨数字化转型所能带来的价值。 数字化转型能够显著提升效率和生产力。通过引入…

【React学习】React组件生命周期

1. 介绍 在 React 中,组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法,在不同的生命周期方法中,开发人员可以执行不同的操作,例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…

TCP中窗口和滑动窗口的含义以及流量控制

一.窗口 在TCP中由于要保证可靠性,所以每发送一条数据后,都需要接收方返回一条应答报文,要是我们每发送一条数据,发送方就等待接收应答报文,收到之后再去发送下一条数据,这样我们就会花费大量的时间在等待应…

数据结构-->栈

💕休对故人思故国,且将新火试新茶,诗酒趁年华💕 作者:Mylvzi 文章主要内容:详解链表OJ题 前言: 前面已经学习过顺序表,链表。他们都是线性表,今天要学习的栈也是一种线…

设计模式-观察者模式(观察者模式的需求衍变过程详解,关于监听的理解)

目录 前言概念你有过这样的问题吗? 详细介绍原理:应用场景: 实现方式:类图代码 问题回答监听,为什么叫监听,具体代码是哪观察者模式的需求衍变过程观察者是为什么是行为型 总结: 前言 在软件设计…

变道超车?中国首架电动垂直起降飞行器即将首飞,载人是亮点

根据御风未来的官方消息,他们的首架全国产电动垂直起降飞行器Matrix 1已经顺利完成了各项地面测试,并且即将迎来首次试飞。这款飞行器采用纯电能源,不需要跑道即可起降,并且具备智能化全自主飞行能力,无需飞行驾驶员操…

C++--红黑树

1.什么是红黑树 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因…

java.net.BindException Address already in use: NET_Bind解决

java.net.BindException Address already in use: NET_Bind 两种解决方法 两种解决方法 (1) kill 占用此端口的线程 查看报错的端口 netstat -ano | findstr 16825tasklist | findstr 1092 如果占用的程序不重要直接kill taskkill /f /pid 16825 (2) 修改启动端口 找一个没…

系统架构设计师-信息安全技术(2)

目录 一、安全架构概述 1、信息安全所面临的威胁 二、安全模型 1、安全模型的分类 2、BLP模型 3、Biba 模型 4、Chinese Wall模型 三、信息安全整体架构设计 1、WPDRRC模型 2、各模型的安全防范功能 四、网络安全体系架构设计 1、开放系统互联安全体系结构 2、安全服务与安…

typedef

t y p e d e f typedef typedef 声明&#xff0c;简称typedef&#xff0c;是创建现有类型的新名字。 比如&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n;scanf("%lld",&n);printf("%lld"…

共定位数据和环境准备

共定位数据和环境准备 一、数据准备 如果需要做eqtl-GWAS的共定位&#xff0c;则需要按照药靶教程中&#xff0c;将eqtl数据放在smr目录内 如果是纯GWAS-GWAS的共定位&#xff0c;涉及到本地数据的&#xff0c;需要将其整理成模板SNP的格式&#xff0c;并且需要chr&#xff0c…

CASAIM与哈尔滨工业大学达成航空航天关键零部件自动化智能测量系统合作,助力航空航天特种复合新材料性能分析

近期&#xff0c;CASAIM与哈尔滨工业大学在航空航天关键零部件自动化智能测量系统展开全面合作&#xff0c;为后续进行航空航天特种复合新材料性能分析提供可靠的试验数据。 哈尔滨工业大学是隶属于工业和信息化部的全国重点大学&#xff0c;是国家“985工程”“211工程”“双…

【Ubuntu】从Graylog到Grafana Loki:构建更强大的网络设备管理和监控系统

在将Graylog部署到生产环境时&#xff0c;我们遇到了一些问题&#xff0c;其中最主要的是无法安装MongoDB并且无法随时重启机器去修改BIOS设置来修复问题 【WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! 】。…

云服务 Ubuntu 20.04 版本 使用 Nginx 配置SSL证书和nginx从HTTP跳转到HTTPS

1.云服务申请免费的SSL证书 2.从云服务SSL证书下载到本地解压上传到服务器 3.配置Nginx下的 nginx.cof 文件 4.开放安全组&#xff0c;内部与外部 5.测试配置与跳转是否成功 1.云服务申请免费的SSL证书 1.1.登录云平台找到SSL证书 注意&#xff1a;博主这里是腾讯云&#x…

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

OJ练习第151题——克隆图

克隆图 力扣链接&#xff1a;133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 示例 分析 对于一张图而言&#xff0c;它的深拷贝即构建一张与原图结构&#xff0c;值均一样的图&#xff0c;但是…