Redis:常用数据结构 单线程模型

article/2025/6/9 1:24:39

🌈 个人主页:Zfox_
🔥 系列专栏:Redis

🔥 常用数据结构

🐳 Redis 当中常用的数据结构如下所示:
在这里插入图片描述
Redis 在底层实现上述数据结构的过程中,会在源码的角度上对于上述的内容进行特定的优化,这样的优化的主要目的是为了实现出节省时间和节省空间的效果,具体的优化方法当然还是要看的是具体的内容

Redis 在外部承诺,对于哈希表来说,保证用户在进行增删查改这些操作都能保证是O(1),但是具体内部的实现来说,其实并不是一个传统意义的哈希表,在特定的实现场景下会使用其他的数据结构来实现,但是总体上来说,还是能够保证时间复杂度是满足具体的要求的

所以我们说,对于 Redis 内部的数据结构或者说是数据类型来说,这是 Redis 承诺给用户的,但是在其内部的实现中,可能会不同,具体的方式是有编码方式来进行决定的,因此换句话说,对于同一个数据结构来说,内部会有不同的实现方式,在不同的场景下会使用不同的方式,但是作为上层的使用者,其实是感知不到这样的存在的

那么下面我将会进行分析,不同的数据结构内部代表的意义是什么,以及是如何进行场景优化的

🦋 Redis 的编码方式

在这里插入图片描述

string

先说 string 类型,这个类型并不陌生,就是一个字符串类型,在内部编码的角度来讲:

  1. 如果采用的是 raw,表示的是最基本的字符串,它的底层就是一个 char 的数组
  2. 而如果采用的是 int 的编码方式,则对应的场景可能是要使用一些类似于计数的功能,那么此时作为 Value 值,其实使用传统意义的字符是没有意义的,直接使用整数int来保存是一个更好的解决方案
  3. 如果采用的是 embstr,则表示的是针对于短字符串进行的特殊优化,这里就不再过多描述

hash

  1. hash 这种数据类型,或者说是数据结构,是有两种编码方式的,第一种是 hashtable,这种实现方式就是最基本的实现方式,Redis 内部也是用这种最基本的方式来实现的,虽然这里的实现方式和前面的不太一样,但是也大体思维差不多
  2. 而对于一些元素比较少的时候,如果还使用哈希表其实是没有意义的,因此就会把对应的编码方式更换为 ziplist,它的主要目的可以进行列表的压缩,这样可以节省空间

🦋 压缩的意义?

那到此,可能会关心的问题是,为什么要进行压缩?意义在哪呢?因为 Redis 内部是有很多的 key 值的,这就意味着对于某些 key 的 Value 是一个 hash,所以当 key 值比较多的时候,对应的 hash 结构也会比较多,但是每一个 hash 的实际占用其实不大,因此就可以选择去尽量的压缩,这样压缩后就可以使得整体上的占用变的比较少了

list

对于list来说,有两种实现的方式,一种是 linkedlist,也就是传统意义上的 list,而另外一个表示的是压缩列表,但是从 Redis 3.2 开始,采用的是一个全新的方式,叫做 quicklist,它可以综合前面的两种类型,这样就针对于空间和效率折中进行实现的

set

对于 set 来说,也有两种实现,第一个是传统意义的实现,第二个表示的是 intset,如果都是使用的 int 类型的数据,那么内部就会选择这种情况

zset

  1. skipset,是跳表,每个节点上有多个指针域,可以快速定位到类型,最终使得搜索效果完成到二叉搜索树的效果,这里不再赘述,前面的内容中已经有对应的策略~
  2. ziplist:压缩
    查看方式
object encoding xxx

Redis 内部,会通过具体的实际情况来调整内部的编码方式,自动进行适应

🔥 单线程架构

Redis使⽤了单线程架构来实现⾼性能的内存数据库服务,本节⾸先通过多个客户端命令调⽤的例⼦说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之⾼,最终给出为什么理解单线程模型是使⽤和运维Redis的关键。

Redis 只使用一个线程处理所有的命令请求,不是说一个 Redis 服务器进程内部真的就只有一个线程其实也有多个线程, 多个线程是在处理 网络 IO

🦋 引出单线程模型

现在开启了三个redis-cli客户端同时执⾏命令。

127.0.0.1:6379> set counter 1

客户端2对counter做⾃增操作:

127.0.0.1:6379> incr counter

客户端3对counter做⾃增操作:

127.0.0.1:6379> incr counter

客户端1设置⼀个字符串键值对:我们已经知道从客⼾端发送的命令经历了:发送命令、执⾏命令、返回结果三个阶段,其中我们重点关注第2步。我们所谓的Redis是采⽤单线程模型执⾏命令的是指:虽然三个客⼾端看起来是同时要求Redis去执⾏命令的,但微观⻆度,这些命令还是采⽤线性⽅式去执⾏的,只是原则上命令的执⾏顺序是不确定的,但⼀定不会有两条命令被同步执⾏,如图2-3、2-4、2-5所⽰,可以想象Redis内部只有⼀个服务窗⼝,多个客⼾端按照它们达到的先后顺序被排队在窗⼝前,依次接受Redis的服务,所以两条incr命令⽆论执⾏顺序,结果⼀定 是2,不会发⽣并发问题,这个就是Redis的单线程执⾏模型。

在这里插入图片描述
在这里插入图片描述

Redis 能够使用 单线程模型 很好的工作, 原因主要在于 Redis 的核心业务逻辑,都是短平快的~~ 不太消耗 cpu 资源也就不太吃多核了!!!

弊端!!
Redis 必须要特别小心, 某个操作占用时间长, 就会阻塞其他命令的执行!

🦋 为什么单线程还能这么快

  1. 纯内存访问。Redis将所有数据放在内存中,内存的响应时⻓⼤约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
  2. Redis 核心功能,比数据库的核心功能更简单,Redis 干的活少,提供的功能相比于 mysq 也是少了不少!
  3. ⾮阻塞IO。Redis使⽤epoll作为I/O多路复⽤技术的实现,再加上Redis⾃⾝的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在⽹络I/O上浪费过多的时间
  4. 单线程避免了线程切换和竞态产⽣的消耗。单线程可以简化数据结构和算法的实现,让程序模型更简单;其次单线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗

🦋 弊端

虽然单线程给Redis带来很多好处,但还是有⼀个致命的问题:对于单个命令的执⾏时间都是有要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客户端的阻塞,对于Redis这种⾼性能的服务来说是⾮常严重的,所以Redis是⾯向快速执⾏场景的数据库

🔥 共勉

😋 以上就是我对 Redis:常用数据结构 & 单线程模型 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述


http://www.hkcw.cn/article/xxKsvrQGdj.shtml

相关文章

HTTP连接管理——短连接,长连接,HTTP 流水线

连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:短连接、_长连接_和 HTTP 流水线。 下面分别来详细解释 短连接 HTTP 协议最初(0.9/1.0)是个非常简单的…

【Typst】1.Typst概述

概述 Typst是一种用于排版文档的标记语言,可以用于排版各种精美的论文、文章、书籍、报告和作业等。它是LaTex的精神续作,但是运行环境和编译速度都要更简单、更快捷。 它设计了一种脚本结合简单的标记语法实现复杂的排版效果。并且支持模板创建、文件…

预警功能深度测评:系统如何降低设备突发故障率?

在设备密集型行业中,设备突发故障不仅会导致生产停滞,还可能引发安全事故,给企业带来巨大损失。设备管理系统凭借其强大的预警功能,成为众多企业降低设备突发故障率的选择工具。本文将深度测评该系统的预警功能,探讨其…

ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”

“高内聚、低耦合”是面向对象编程中非常重要的设计原则,它有助于提高代码的可维护性、扩展性和复用性。 1. 初衷:为什么会有这个原则? 在软件开发中,随着业务需求的复杂化,代码难免会变得越来越庞大。如果开发者将一…

贪心算法应用:边着色问题详解

贪心算法应用:边着色问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。边着色问题是图论中的一个经典问题,贪心算法可以有效地解决它。下面我将从基础概念到具体实现,全…

基于 Amazon Q Developer CLI 和 Amazon Bedrock Knowledge Bases 实现智能问答系统

1. 引言 传统企业通常将常见问题(FAQ)发布在网站上,方便客户自助查找信息。然而,随着生成式 AI 技术的迅速发展与商业渗透,这些企业正积极探索构建智能问答系统的新途径。这类系统不仅能显著提升客户体验,…

ElasticStack对接kafka集群

背景 在当代数字化浪潮中,日志数据的高效处理对于企业运维监控和数据分析至关重要。本博文聚焦于ELK(Elasticsearch、Logstash、Kibana)技术栈与Kafka集群的深度对接,旨在探讨如何通过这一架构优化,实现高效、可靠且可…

【云计算】基础篇,含云测试

一、云计算中的底层原理 1.1 数学原理 云计算的高效运行依赖于多种数学原理的协同支撑,其核心数学原理: 1.1.1、分布式计算的数学基础 ​分治与并行模型​ ​MapReduce​:将大数据集分割为独立子任务(Map阶段),通过哈希函数分发到分布式节点并行处理,再聚合结果(Redu…

高效易用的 MAC 版 SVN 客户端:macSvn 使用体验

高效易用的 MAC 版 SVN 客户端:macSvn 使用体验 下载安装使用总结 最近有个项目要使用svn, 但是mac缺乏一款像 Windows 平台 TortoiseSVN 那样全面、高效且便捷的 SVN 客户端工具, 直到博主找到了该工具本文将结合实际使用体验,详细介绍 macSvn工具的核心…

从0到1认识EFK

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…

TDengine 的 AI 应用实战——运维异常检测

作者: derekchen Demo数据集准备 我们使用公开的 NAB数据集 里亚马逊 AWS 东海岸数据中心一次 API 网关故障中,某个服务器上的 CPU 使用率数据。数据的频率为 5min,单位为占用率。由于 API 网关的故障,会导致服务器上的相关应用…

VMWare安装常见问题

如果之前安装过VMWare软件,只要是 15/16 版本的,可以正常使用的,不用卸载!!! 如果之前安装过,卸载了,一定要保证通过正常的渠道去卸载(通过控制面板卸载软件&#xff09…

MyBatis02——mybatis基础使用|缓存机制|sqlMapper文件|单参数和多参数传递|Statement和PreparedStatement

目录 一、搭建环境 二、核心配置文件 三、核心类 (测试类) 四、缓存机制 一级缓存 二级缓存 清理缓存 五、sqlMapper文件 六、单参数和多参数的传递 6.1取别名 6.2 测试新增返回自增主键 七、mybatis中Statement和PreparedStatement 作业 1…

Grafana-State timeline状态时间线

显示随时间推移的状态变化 状态区域:即状态时间线上的状态显示的条或带,区域长度表示状态持续时间或频率 数据格式要求(可视化效果最佳): 时间戳实体名称(即:正在监控的目标对应名称&#xf…

便捷高效能源服务触手可及,能耗监测系统赋能智能建筑与智慧城市

在建筑行业迈向智能化、精细化管理的进程中,传统建筑管理模式因信息割裂、数据利用不足等问题,逐渐难以满足现代建筑复杂的运营需求。楼宇自控系统实现了建筑设备的智能调控,BIM技术则构建了建筑的三维数字化模型,当两者相遇&…

论文阅读:CLIP:Learning Transferable Visual Models From Natural Language Supervision

从自然语言监督中学习可迁移的视觉模型 虽然有点data/gpu is all you need的味道,但是整体实验和谈论丰富度上还是很多的,也是一篇让我多次想放弃的文章,因为真的是非常长的原文和超级多的实验讨论,隔着屏幕感受到了实验的工作量之…

【连接器专题】案例:产品测试顺序表解读与应用

在查看SD卡座连接器的规格书,一些测试报告时,你可能会看到如下一张产品测试顺序表。为什么会出现一张测试顺序表呢? 测试顺序表的使用其实定义测试环节的验证的“路线图”和“游戏规则”,本文就以我人个经验带领大家一起看懂这张表并理解其设计逻辑。 测试顺序表结构 测试…

【MATLAB代码】制导方法介绍与例程——三点法|三维空间,动态目标导引(订阅专栏后可直接查看源代码)

三点法导引是一种导弹制导策略,通过计算导弹、目标和制导站之间的相对位置来确保导弹准确追踪移动目标。该方法利用三角定位和动态调整,实时更新导弹的飞行路径,以提高命中率,广泛应用于军事导弹和无人机等领域。文中有完整的matlab源代码,订阅专栏后即可查看 文章目录 代…

AUTOSAR CP——Can模块

Can模块的主要配置信息 其他相关模块 通讯框图 Can网络唤醒配置:当硬件支持的时候,可以通过Bus唤醒,见《TechnicalReference_Can_ Rscan》 P30 _5.5.1 Wakeup Functionality:RH850芯片时,在不使用SBC时,…

项目执行中缺乏灵活应对机制,如何增强适应性?

项目执行中缺乏灵活应对机制可以通过建立风险预警机制、培养团队快速响应能力、制定动态调整方案、加强团队沟通协作、引入敏捷管理理念来增强适应性。 其中,培养团队快速响应能力尤为重要。这种能力意味着当项目遇到突发状况时,团队能迅速评估问题、确定…