Redis为什么被设计为单线程

这篇具有很好参考价值的文章主要介绍了Redis为什么被设计为单线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        redis是单线程的原因在于redis用单个CPU绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的。redis核心就是 如果我的数据全都在内存里,我单线程的去操作就是效率最高的。所以,redis是单线程。

一、 Redis为什么那么快

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

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

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

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

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

以上几点都比较好理解,下边针对多路 I/O 复用模型进行简单的探讨:

(1)多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

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

二、为什么Redis是单线程的

首先要明白,上边的种种分析,都是为了营造一个Redis很快的氛围。官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

这里我们一直在强调的单线程,只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的,这里需要大家明确的注意一下。例如Redis进行持久化的时候会以子进程或者子线程的方式执行。文章来源地址https://www.toymoban.com/news/detail-831843.html

到了这里,关于Redis为什么被设计为单线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每天五分钟计算机视觉:为什么说1*1的卷积核是全连接神经网络?

    上一节课程中我们对1*1的卷积核进行了介绍,他可以降低或者升高输入的通道数,或者增加复杂度。除此之外,1*1的卷积核的效果类似于全连接神经网络,但是并不能完全等价,本节课程我们来详细的看一下,1*1的卷积核和全连接神经网络之间的关系是什么? 如上图所示,假

    2024年02月03日
    浏览(42)
  • 什么是线程?为什么需要线程?和进程的区别?

    目录 前言 一.线程是什么? 1.1.为什么需要线程 1.2线程的概念 1.3线程和进程的区别  二.线程的生命周期 三.认识多线程 总结 🎁个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 🎥 本文由 tq02 原创,首发于 CSDN🙉 🎄 本章讲解内容: 线程的讲解 🎥学习专栏:

    2024年02月14日
    浏览(60)
  • Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

    一、Redis是什么 Redis 是一种 基于内存的数据库 ,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于 缓存,消息队列、分布式锁等场景 。         Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    浏览(52)
  • 为什么要使用线程池

    线程池主要是 控制运行的线程的数量 ,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。 Java线程的 创建 非常昂贵,需要 JVM 和 OS (操作系统)配合

    2023年04月09日
    浏览(44)
  • 为什么使用线程池?解释下线程池参数?

    (1)降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗。 (2)提高响应速度:任务来了,直接有线程可用可执行,而不是线创建线程再执行。 (3)提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。 (1)corePoolSize:代表核心线程数,也

    2024年02月16日
    浏览(38)
  • 【Redis】redis为什么快

        ​ 🍎 个人博客: 个人主页 🏆 个人专栏: Redis   ⛳️   功不唐捐,玉汝于成 ​ 目录 前言 正文 结语  我的其他博客 在当今的计算机应用领域,数据存储和高性能访问成为系统设计中至关重要的一环。Redis以其卓越的性能、简洁而强大的设计原则,成为众多开发者和

    2024年01月25日
    浏览(37)
  • 为什么arrayList线程不安全?

            ArrayList是Java中的一种动态数组,它在内部使用数组来存储元素。ArrayList的线程不安全性主要体现在多线程并发访问和修改同一个ArrayList实例时可能出现的问题。         当多个线程同时对ArrayList进行修改操作时,可能会导致数据不一致或者出现异常。这是因为

    2024年02月12日
    浏览(39)
  • 为什么要用线程池?

    线程池是一种管理和复用线程资源的机制,它由一个线程池管理器和一组工作线程组成。线程池管理器负责创建和销毁线程池,以及管理线程池中的工作线程。工作线程则负责执行具体的任务。 线程池的主要作用是管理和复用线程资源,避免了线程的频繁创建和销毁所带来的

    2024年02月06日
    浏览(56)
  • 【Redis】为什么要学 Redis

    关于为什么要学 Redis 这个问题,一个字就可以回答,那就是:快! Redis是一个将数据储存到内存中的非关系型数据库,它是以键值对的形式来组织数据的,一般可以用作内存数据库、缓存、消息队列等。 使用 Redis 的主要原因就是因为它的快,但是它的快是相对于 MySQL 等这样

    2024年02月09日
    浏览(33)
  • ArrayList为什么不是线程安全的,如何保证线程安全?

    官方曰, 线程安全就是多线程访问时,采⽤了加锁机制,当⼀个线程访问该类的某个数据时,进⾏保护,其他线程不能进⾏访问直到该线程读取完,其他线程才可使⽤。不会出现数据不⼀致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包