Redis为什么这么快(redis为什么6379)
mhr18 2024-11-07 10:56 26 浏览 0 评论
Redis为什么这么快
说到redis第一个字绝对是快,但要是细说为什么这么快,绝大多数人的回答应该是redis基于内存操作,但真是这么简单吗?显然不是,我们常说redis是单线程的那为什么在持久化RDB时会fork子进程,redis的单线程到底是在哪些地方使用,redis为什么考虑使用单线程而不使用多线程呢?redis单线程为什么这么快呢?我们带着疑问可以往下面思考。
redis单线程在哪些地方使用
redis单线程并不是所有的操作都是单线程,例如持久化、集群数据同步、异步删除等等这些都是其它子线程操作,单线程只是指==Redis的网络IO和键值对读写是由一个线程完成==。
redis为什么使用单线程
众所周知多线程能提高程序的吞吐量以及降低延迟,如果程序需要提升效率肯定会考虑引进多线程,但线程的数量并不是越多越好,线程数量增加CPU的上下文切换会带来资源的浪费,另外线程间会存在数据竞争为了保证数据的正确性需要添加互斥锁,互斥锁将有线程安全问题的数据串行执行保证线程安全,这也让程序的效率大打折扣。
redis为避免以上问题,索性只用单线程执行,redis官方解释如下
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
redis单线程为什么这么快
redis快的原因分析如下
- 基于内存操作,其写入存储效率极佳。
- 高效的数据类型如跳表、哈希表等。
- redis采用多路复用IO模型,能够在网络IO操作中并发处理客户端请求。
那什么是多路复用IO模型呢?聊这个之前我们需要了解普通的网络IO模型。
普通网络IO模型
如果redis使用的是普通的IO模型,那么键值的读取get方法应该有如下执行过程
上图的网络模型存在阻塞的风险,主要是网络IO处理模块
- accept:当网络IO开始监听但是一直没有和客户端建立正常连接会导致IO阻塞等待。
- recv:redis通过recv从客户端读取请求,如果数据一直未到达那么将一直阻塞等待。
redis是单线程那么网络IO模型一旦发生阻塞,整个应用都将阻塞无法响应其它客户端请求,那如何解决这个问题呢?网络模型提供了非阻塞方法。
网络IO非阻塞模型
网络非阻塞模型主要依靠三个不同的方法,调用这些方法会返回不同类型的**==套接字==**。
什么是套接字呢?
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口
这些套接字就可以实现网络IO的非阻塞模型,socket方法会返回主动套接字,接着调用listen方法会将主动套接字转换为监听套接字,这个套接字就可以监听客户端请求,调用accept方法接收到达的客户端请求,并且返回已连接套接字。
如果在普通IO模型中设置监听套接字非阻塞,那么在和客户端建立连接(调用网络IO处理的accept方法)后客户端一直未建立连接,redis线程可以返回执行其它操作,而不用一直等待,因为存在监听套接字,在客户端建立请求成功后会立即通知redis。
如果在普通IO模型中设置已连接套接字非阻塞,那么在等待客户端请求(调用网络IO处理的recv方法)已连接套接字一直未有数据返回,redis也不需要持续等待,可以立即返回,后续请求到达需要立即通知到redis。
多路复用IO模型
多路复用IO模型其实就是上述网络IO非阻塞模型的演化,Linux中的多路复用IO模型,指的是一个线程处理多个IO流,也就是我们常常听到的select/epoll机制,简单理解就是,redis在单线程下允许内核中存在多个监听套接字和已连接套接字,当套接字发现连接请求或者数据请求到达就会通知redis,redis立即处理,不需要redis阻塞等待请求到达,这样就实现了单个线程能处理多个网络IO请求。
多路复用IO模型结构图如下所示,多路复用IO模型让内核监听这些套接字,redis不再需要阻塞等待,所以redis才能实现一个线程处理多个客户端的请求。
为了在请求到达后即时通知redis,多路复用IO模型采用了事件回调函数,针对不同的事件调用不同的函数。
当内核监听到请求连接和读(写)数据请求时,监听套接字和已连接套接字会触发AcceptEvent事件和ReadEvent(WriteEvent)事件并且注册回调函数accept和get(put),产生的事件放入事件队列中,这样Redis就不用轮询查询是否有事件产生,节省CPU的资源消耗,直接由Redis在队列中出队事件,从而调用回调函数完成逻辑。
这种实现方式映射到现实中类似病人去医院看病,医生诊断前(Redis处理请求)都需要病人(请求)登记、排队、测量体温等流程,如果这些工作都由医生完成,那么医生的工作效率将非常低,所以医院设置分诊台,分诊台将看病前的工作(Linux内核监听)全部完成,然后转交给医生做诊断,这样即使是一个医生(单线程)效率也会很高。
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)