单线程Redis:Redis为什么这么快

news/2024/9/19 0:53:10/ 标签: redis, 数据库

1 Redis是不是单线程

在这里插入图片描述

Redis 使用后台线程执行耗时的 I/O 操作,以免阻塞主线程

bio_close_file:后台 I/O 线程之一,异步关闭文件
bio_aof_fsync:后台 I/O 线程之一,异步地将 AOF(Append Only File)日志同步到磁盘
bio_lazy_free:异步释放内存,有些内存释放操作可能比较耗时,因此这些操作可以异步完成,以免阻塞主线程
jemalloc_bg_thd:这是由 jemalloc 内存分配器产生的后台线程。jemalloc 是 Redis 默认使用的内存分配器,因为它在多线程环境中表现出色,能够有效地管理内存碎片。这个后台线程通常用于维护和优化内存使用(例如回收空闲内存)。

如果有io_thd_1之类的,则是在处理网络IO

一般认为Redis是单线程,是因为Redis的命令处理是单线程的

1.1 为什么Redis是单线程

单线程的局限:

  • 不能有耗时操作,包括cpu运算和阻塞io

但Redis仍存在耗时操作

io密集型:

  • 磁盘io:有两种方式持久化,一种是bio_aof_fsync,开启一个线程持久化,另外一种是rdb,通过fok进程,在子进程持久化
  • 网络io:Redis需要处理多个服务,Redis采用Reactor网络模型,实现IO多路复用;若数据请求或返回数据量比较大,则会开启io多线程

cpu密集型:

  • Redis使用高效的数据结构,并允许数据结构切换,当数据量大的时候,需使用O(1)、O(lgn)复杂度的数据结构
  • 渐进式数据迁移

Redis为什么不采用多线程?
采用多线程需加锁,加锁复杂,加锁粒度不好控制,加锁会造成频繁的CPU上下文切换,抵消多线程的优势

1.2 单线程为什么快

  1. Redis使用了内存数据库

  2. Redis是一个key-value数据库,数据存储在hashtable中,复杂度是O(1),为了保证O(1)的复杂度,hash冲突不能太激烈。

若数据太多,而hashtable太小,则非常容易冲突。

而Redis是内存数据库,一开始就分配很大空间,浪费内存,因此Redis动态分配数组大小,允许进行扩容、缩容操作。

负载因子:used / size

  • 如果负载因子 > 1 ,则会发生扩容
  • 如果正在 fork (在 rdb、aof 复写以及 rdb-aof 混用情况下)时,会阻止扩容
  • 但是此时若负载因子 > 5 ,索引效率大大降低, 则马上扩容
  • 如果负载因子 < 0.1 ,则会发生缩容

扩容:位于0号的元素,会分别散落在0号和4号,其余同理
在这里插入图片描述

在这里插入图片描述

渐进式Rehash:

若hashtable的size非常大,进行翻倍迁移的时候,是一个非常耗时的操作,但Redis仍然需要服务用户,因此不能一次性迁移。

server.h:6.2.12版本
在这里插入图片描述

dict:存储的keys
expires:过期的keys
blocking_keys:阻塞的keys

在这里插入图片描述

可以看到有一个ht[2],即hashtable有两个,在没有扩容和缩容的时候,通常只使用ht[0],扩容时,会将ht[0]中的数据放入到ht[1]中,并将ht[1]的大小翻倍。

在这里插入图片描述

rehash步骤:
ht[0] 中的元素重新经过 hash 函数生成 64 位整数,再对 ht[1] 长度进行取余,从而映射到 ht[1]

渐进式rehash:

  • 将数据的rehash操作,分摊在增删改查操作中,每次操作一个索引中的全部元素,直到rehash结束,将ht[1]赋值给ht[0],并将ht[1]置为空
  • 在定时器中,在redis空闲时,最大执行一毫秒 rehash ;每次步长 100 个数组槽位
  1. 高效的reactor网络模型

1.3 scan

KEYS *命令非常耗时,若想获取所有keys,可以使用scan命令

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

在这里插入图片描述

采用高位进位加法的遍历顺序,rehash 后的槽位在遍历顺序上是相邻的

在这里插入图片描述

接下来应该遍历16号索引

在这里插入图片描述

2 string

三种编码

  • int:字符串长度小于等于20且能转成整数
    • 对于大整数,int占的字节比字符串更少
  • raw:字符串长度大于44
  • embstr:字符串长度小于等于44

在这里插入图片描述

在Redis中,string被实现成sds,它包含一些头部,但仍返回实际存储数据的地址。

最后的char buf[]是柔性数组,使用sizeof会不包含char buf[]

面试题:为什么Redis中字符串选择44个字节作为分界线?

embstr顾名思义就是嵌入字符串,嵌入到redisObject中

在这里插入图片描述

在这里插入图片描述

redisObject共占用4 + 4 + 8字节

长度为44的话,选择了sdshdr8的结构(表示长度0-128),sdshr8头部占用了3个字节

cpu cache line最小访问单位为64个字节

同时sds为了兼容strlen等函数,在柔性数组最后加上’\0’分隔符

因此64 - (4 + 4 + 8) - 3 - 1 = 44

3 Redis跳表

跳表(多层级有序链表)结构用来实现有序集合,redis 需要实现 zrange 以及 zrevrange功能,需要节点间最好能直接相连并且增删改操作后结构依然有序

节点数量大于 128 或者有一个字符串长度大于 64,则使用跳表(skiplist)

在这里插入图片描述

4 Redis IO多线程原理

对于一个Redis请求,需要经过read、decode、compute、encode、send这5个流程。

而有时候read、decode、encode、send过程很慢,把它们放在主线程操作,很浪费时间,因此Redis使用了IO多线程。

在这里插入图片描述

将多个IO分发到多个线程(包括主线程)中,但所有的compute仍在主线程中,因此,这与Redis是单线程的并不冲突。

参考链接:https://xxetb.xetslk.com/s/1QH6AQ


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

相关文章

告别PDF格式困扰,2024年PDF转换器推荐

PDF现在已经逐渐成为了文件传输的主流格式了&#xff0c;它有保存文件页面版式的优点&#xff0c;但是这个格式编辑对大部分人来说还是不那么方便&#xff0c;日常我们还是习惯将它们转换成我们常见的 文本格式来操作。今天我分享一下可以实现PDF格式转换的pdf转换器有哪些吧。…

Hive的体系架构、安装

目录 一、Hive体系架构二、安装1.嵌入模式2.本地模式和远程模式 一、Hive体系架构 二、安装 1.嵌入模式 特点 不需要Mysql支持&#xff0c;数据存储在自带的derby中只支持一个链接&#xff0c;即一时间只能有一个用户操作 部署 根据如下文件自行编写hive-site.xml hive-sit…

jmeter响应断言、json断言、断言持续时间、大小断言操作

在jmeter断言当中、常用的有响应断言、json断言、断言持续时间&#xff0c;大小断言等 一、响应断言 Apply to&#xff1a;断言应用的范围&#xff0c;这里默认&#xff0c;通常发出一个请求只触发一个服务器测试字段 响应文本&#xff0c;response响应体内的信息响应代码&am…

C语言备忘

环境搭建&#xff1a; 1.minGW下载&#xff1a;Index of /msys2/distrib/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 安装完打开的窗口中运行&#xff1a; pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain运行完后把安装的程序bin放到…

day36

1.1 前言 C语言是完全面向过程语言&#xff0c;C是半面向过程半面向对象语言&#xff0c;C#、QT是完全面向对象的编程语言 C是对C语言的扩充&#xff0c;所有C语言的语法&#xff0c;C都可以直接使用 C的编译器是g,要求比C语言的编译器gcc更加严格 C的文件后缀为 .cpp .…

小柴带你学AutoSar系列三、标准和规范篇(3)ModeManagement

目录 ModeManagementGuide 2 Overall mechanisms and concepts 2.1 Declaration of modes 2.2 Mode managers and mode users 2.3 Modes in the RTE 2.4 Modes in the Basic Software Scheduler 2.5 Communication of modes 3 Configuration of the Basic Software Mod…

JAVA学习-练习试用Java实现“数据流的中位数”

问题&#xff1a; 中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数据结构&#xff1a; void addNum(int num) - 从数据…

深入理解linux内核hung_task机制,最全!原创!

背景 最近的一个项目里&#xff0c;发生的问题近乎多半都是hangdetect的问题&#xff0c;之前一直对这种问题总是一知半解&#xff0c;发现主要是因为对此种维测方案(hangdetect/hangtask/watchdog/hungdetect)的理解不够深刻&#xff0c;而更深层次的原因是对于内核的各种机(…

基于JavaWeb开发的Java+Springboot+Vue+elememt美食论坛平台设计实现

基于JavaWeb开发的JavaSpringbootVueelememt美食论坛平台设计实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

夸父追日:第七章 回溯算法part02

今日收获&#xff1a;组合总和&#xff0c;组合总和Ⅱ&#xff0c;分割回文串 代码随想录&#xff1a;for循环横向遍历&#xff0c;递归纵向遍历&#xff0c;回溯不断调整结果集。 1. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 思…

OpenCV小练习:人脸检测

OpenCV自带人脸检测模型&#xff0c;拿来就能用。所以“人脸检测”这个任务对于OpenCV而言真是太简单了——感叹一下&#xff1a;OpenCV太强大了&#xff01;相关的介绍文章在网上可以搜到很多&#xff0c;原本我觉得没必要再写一篇了。结果我在写练习代码的时候&#xff0c;还…

认识人工智能(AI,Artificial Intelligence)

人工智能(AI, Artificial Intelligence)是当今科技领域最引人注目的前沿技术之一。它的影响已渗透到各行各业,从日常生活中的虚拟助手到复杂的工业自动化系统,AI 的应用无处不在。本文将详细探讨人工智能的定义与发展历程、学习人工智能的目的、人工智能在实际生活中的应用…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字&#xff1f;识别视频声音转文字技术&#xff0c;不仅极大地提升了信息处理的效率&#xff0c;还促进了跨语言沟通和文化交流。在全球化背景下&#xff0c;它成为了连接不同语言群体的桥梁。此外&#xff0c;随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码&#xff0c;可以让我们直接拿来用 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展&#xff0c;大模型智能体成为热门研究方向&#xff0c;受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…