iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解Redis单线程的正确理解
  • 744
分享到

详解Redis单线程的正确理解

2024-04-02 19:04:59 744人浏览 泡泡鱼
摘要

很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。 一、R

很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。

一、Redis的单线程理解

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有到达服务端的命令都不会立刻执行,所有的命令都会进入一个队列中,然后逐个执行,并且多个客户端发送的命令的执行顺序是不确定的,但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

Redis服务器通过Socket(套接字)与客户端或其他Redis服务器进行连接,而文件事件就是服务器对socket操作的抽象。服务器与客户端或其他服务器的通信会产生相应的文件事件,而服务器通过监听并处理这些事件来完成一系列网络通信操作。

Redis基于Reactor模式开发了自己的网络事件处理器——文件事件处理器,文件事件处理器使用I/O多路复用程序来同时监听多个socket(I/O多路复用技术下面有介绍),并根据socket目前执行的任务来为socket关联不同的事件处理器。当被监听的socket准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用socket之前已关联好的事件处理器来处理这些事件。

文件事件处理器的构成:

 

注意:其中I/O多路复用程序通过队列向文件事件分派器传送socket

二、I/O多路复用技术

关于I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGaiN的无用功,写操作类似。

操作系统的这个功能是通过select/poll/epoll/kqueue之类的系统调用函数来实现,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“多路”指的是多个网络连接,“复用”指的是复用同一个Redis处理线程。(正如上图所示)

采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 I/O 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,所有 Redis 具有很高的吞吐量。

三、常见疑问解答

1、Redis的单线程为什么这么快?

1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2.数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3.采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4.使用多路I/O复用模型,非阻塞I/O;

5.Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

2、为什么不采用多进程或多线程处理?

1.多线程处理可能涉及到锁

2.多线程处理会涉及到线程切换而消耗CPU

3、单线程处理的缺点?

1.耗时的命令会导致并发的下降,不只是读并发,写并发也会下降

2.无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

4、Redis不存在线程安全问题?

Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作(即:多个Redis操作命令)的复合操作来说,依然需要锁,而且有可能是分布式锁。

到此这篇关于详解Redis单线程的正确理解的文章就介绍到这了,更多相关Redis单线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Redis单线程的正确理解

本文链接: https://www.lsjlt.com/news/125379.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Redis单线程的正确理解
    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。 一、R...
    99+
    2024-04-02
  • 关于Redis单线程的正确理解
    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。 一、R...
    99+
    2024-04-02
  • springboot中redis正确的使用详解
    redis实现了对数据的缓存,在项目里一些字典数据,会话数据,临时性数据都会向redis来存储,而在springboot里对redis也有支持,一般来说多个线程共同使用一个redis...
    99+
    2024-04-02
  • gitstash的正确用法详解
    目录概述git stash 具体用法概述 前段时间突然发现,我之前对git stash的使用都是错误的。 具体说来,我是这么使用的:在远端有新的提交,需要git pull来拉取合并...
    99+
    2023-02-06
    git stash用法 git stash
  • Java BigDecimal正确用法详解
    目录一、背景二、事故案例1、问题2、问题复现3、源码分析4、原因分析三、总结四、工具类一、背景 BigDecimal 平时主要用于计算金钱时,其自身提供了很多的构造方法,但是这些构造...
    99+
    2024-04-02
  • 如何正确理解RESTful
    这篇文章主要讲解了“如何正确理解RESTful”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何正确理解RESTful”吧! 前言在学习RESTf...
    99+
    2024-04-02
  • GO使用Mutex确保并发程序正确性详解
    目录1. 简介2. 基本使用2.1 基本定义2.2 使用方式2.3 使用例子2.3.1 未使用mutex同步代码示例2.3.2 使用mutex解决上述问题3. 使用注意事项3.1 L...
    99+
    2023-03-03
    GO Mutex并发正确性 Mutex确保并发正确性
  • 一文了解Java 线程池的正确使用姿势
    目录概述线程池介绍线程池创建ThreadPoolExecutor创建Executors创建newFixedThreadPoolnewCachedThreadPoolnewSingle...
    99+
    2022-11-13
    Java 线程池使用 Java 线程池
  • useCallback和useMemo的正确用法详解
    目录正文缓存值缓存函数组件为什么会重新渲染缓存复杂的计算什么是复杂的计算何时进行优化呢总结正文 现实很多项目存在大量的useMemo和useCallback,大多数的使用并没有起到实...
    99+
    2023-01-15
    useCallback和useMemo用法 useCallback useMemo
  • html的正确理解是什么
    HTML,即超文本标记语言,是一种标记语言,它用于编写web文档并实现网页的结构和内容。HTML是web开发中的重要组成部分,它的正确理解有助于开发者更好地掌握web技术。HTML的原始目的是为了向用户展示文本(包括图像和链接等内容),并且...
    99+
    2023-05-14
  • JavaScript的单线程怎么理解
    本文小编为大家详细介绍“JavaScript的单线程怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript的单线程怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2024-04-02
  • 怎么理解Redis中多线程
    这篇文章主要介绍“怎么理解Redis中多线程”,在日常操作中,相信很多人在怎么理解Redis中多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Redis中多线程”...
    99+
    2024-04-02
  • js indexOf 的正确用法示例详解
    目录js indexOf 的正确用法补充:js中indexOf()的使用示例1:查找字符串中某一字符从头开始第一次出现的索引示例2:查找字符串中某一字符从指定位置开始第一次出现的索引...
    99+
    2023-02-05
    js indexOf 用法 js indexOf 使用
  • redis单线程并发问题如何解决
    Redis是一个单线程的内存数据库,它使用了事件驱动的模型,通过将请求放入一个队列中顺序执行来实现并发处理。但是,在高并发情况下,可...
    99+
    2023-09-11
    redis
  • C++异常处理noexcept正确使用示例详解
    目录C++ 异常处理使用noexcept代替throw用noexcept来解决移动构造问题noexcept和throw()哪些类函数默认使用了noexcept使用noexcept的时...
    99+
    2023-05-17
    C++ 异常处理noexcept C++ 异常处理
  • 正则表达式中问号(?)的正确用法详解
    目录1、直接跟随在子表达式后面2、非贪婪匹配3、非获取匹配4、断言参考资料:正则表达式中“”的用法大概有以下几种 1、直接跟随在子表达式后面 这种方式是最常用...
    99+
    2024-04-02
  • 详解JS中异常与错误处理的正确方法
    目录简介1 面向错误编程1.1 墨菲定律1.2 先判否2. js 内置的错误处理2.1 Error 类2.2 throw2.3 try catch2.4 Promise.catch3...
    99+
    2023-05-16
    JS异常处理 JS错误处理 JS异常
  • 详解Flutter中key的正确使用方式
    目录1、什么是key2、key的更新原理3、key的分类GlobalKeyLocalKey总结1、什么是key Widget中有个可选属性key,顾名思义,它是组件的标识符,当设置...
    99+
    2023-01-28
    Flutter key使用方式 Flutter key
  • ProxyWidget和Element更新的正确方式详解
    目录正文1. ProxyWidget和ProxyElement的主要功能2. InheritedWidget2.1 注册2.2 通知2.3 何时更新?3. ParentDataWid...
    99+
    2023-01-18
    ProxyWidget Element更新 ProxyWidget Element
  • C#单线程和多线程端口扫描器详解
    目录一、项目创建以及页面设计(一)项目新建(二)页面设计二、单线程实现端口扫描(一)代码实现(二)运行结果三、多线程实现端口扫描(一)程序实现(二)运行结果四、总结五、参考资料本文为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作