返回顶部
首页 > 资讯 > 数据库 >redis属于单线程还是多线程
  • 943
分享到

redis属于单线程还是多线程

2024-04-02 19:04:59 943人浏览 独家记忆
摘要

小编给大家分享一下Redis属于单线程还是多线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis4.0之前是单线程运行的

小编给大家分享一下Redis属于单线程还是多线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Redis4.0之前是单线程运行的;Redis4.0后开始支持多线程。Redis4.0之前使用单线程的原因:1、单线程模式方便开发和调试;2、Redis内部使用了基于epoll的多路复用;3、Redis主要的性能瓶颈是内存或网络带宽。

不同版本的Redis是不同的,在Redis4.0之前,Redis是单线程运行的,但单线程并不代表效率低,像Nginxnodejs也是单线程程序,但是它们的效率并不低。

原因是Redis是基于内存的,它的瓶颈在于机器的内存、网络带宽,而不是CPU,在CPU还没达到瓶颈时机器内存可能就满了、或者带宽达到瓶颈了。因此CPU不是主要原因,那么自然就采用单线程了,况且使用多线程比较麻烦。

但是在Redis4.0的时候,已经开始支持多线程了,比如后台删除等功能。

简单来说,Redis在4.0之前使用单线程的模式是因为以下三个原因:

  • 使用单线程模式的Redis,其开发和维护更简单,因为单线程模式方便开发和调试。

  • 即使使用单线程模型也能够并发地处理多客户端的请求,主要是因为Redis内部使用了基于epoll的多路复用。

  • 对于Redis来说,主要的性能瓶颈是内存或网络带宽,而非CPU。

但Redis在4.0以及之后的版本中引入了惰性删除(也叫异步删除),意思就是我们可以使用异步的方式对Redis中的数据进行删除操作,例如:

  • unlink key:和del key类似,删除指定的key,若key不存在则key被跳过。但是del会产生阻塞,而unlink命令会在另一个线程中回收内存,即它是非阻塞的【Http://www.redis.cn/commands/unlink.html】;

  • flushdb async:删除当前数据库的所有数据【http://www.redis.cn/commands/flushdb.html】;

  • flushall async:删除所有库中的数据【http://www.redis.cn/commands/flushall.html】。

这样处理的好处是不会使Redis的主线程卡顿,会把这些操作交给后台线程来执行。

【通常情况下使用del指令可以很快的删除数据,但是当被删除的key是一个非常大的对象时,例如:删除的时包含成千上万个元素的hash集合时,那么del指令就会造成Redis主线程卡顿,因此使用惰性删除可以有效避免Redis卡顿问题。】

考点分析:

关于Redis线程模型的问题(单线程或多线程)几乎是Redis必问的问题之一,但回答好的人却不多,大部分只能回答上来Redis是单线程的以及说出来单线程的众多好处,但对于Redis4.0和Redis6.0中,尤其是Redis6.0中多线程的特点,能够准确回答上来的人非常少。关于单线程和多线程的相关知识,还有以下面试题

1.Redis主线程既然是单线程,为什么还这个快?

2.介绍一下Redis中的io多路复用?

3.介绍一下Redis6.0中的多线程?

1.Redis为什么这么快?

原因有以下几点:

a.基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以它的性能比较高。

b.数据结构简单:Redis的数据结构比较简单,是为Redis专门设计的,而这些简单的数据结构的查找和操作的时间复杂度都是O(1)。

c.多路复用和非阻塞IO:Redis使用IO多路复用功能来监听多个Socket连接的客户端,这样就可以使用一个线程来处理多个情况,从而减少线程切换带来的开销,同时也避免了IO阻塞操作,从而大大提高了Redis的性能。

d.避免上下文切换:因为是单线程模型,因此就避免了不必要的上下文切换和多线程竞争,这就省去了多线程切换带来的时间和性能上的开销,而且单线程不会导致死的问题发生。

官方使用的基准测试结果表明,单线程的Redis可以达到10W/S的吞吐量。

2.IO多路复用是什么?

套接字的读写方法默认是阻塞的,例如当调用读取操作read方法时,缓冲区没有任何数据,那么这个线程会卡在这里,直到缓冲区有数据或者连接被关闭时,read方法才会返回,该线程才能继续处理其他业务。

但这样显然就降低了程序的执行效率,而Redis使用的时非阻塞的IO,这就意味着IO的读写流程不再是阻塞的,读写方法都是瞬间完成并且返回的,也就是它会采用能读多少就读多少、能写多少就写多少的策略来执行IO操作,这显然更符合我们对性能的追求。

但这种非阻塞的IO也面临一个问题,那就是当我们执行读取操作时,有可能只读取了一部分数据;同理写数据也是这种情况,当缓冲区满了,而我们的数据还没有写完,那么生效的数据何时写就成了一个问题。

而IO的多路复用就是解决上面的这个问题的,使用IO多路复用最简单的方式就是使用select函数,此函数是操作系统提供给用户程序的api接口,用于监控多个文件描述符的可读和可写情况的,这样就可以监控到文件描述符的读写事件了。当监控到相应的时间之后就可以通知线程处理相应的业务了,这样就保证了Redis读写功能的正常执行。

【不过现在的操作系统已经基本上不适用select函数了,改为调用epoll函数(linux)了,MacOS则是使用Kqueue(继承与Unix),因为select函数在文件描述符非常多的时候性能非常差。】

3.Redis6.0中的多线程?

Redis单线程的优点非常,不但降低了Redis内部实现的负责性,也让所有操作都可以在无锁的情况下进行,并且不存在死锁和线程切换带来的性能以及时间上的消耗;但是其缺点也很明显,单线程机制导致Redis的QPS(Query Per Second,每秒查询数)很难得到有效的提高(虽然够快了,但人毕竟还是要有更高的追求的)。

Redis在4.0版本中虽然引入了多线程,但是此版本的多线程只能用于大数据量的异步删除,对于非删除操作的意义并不是很大。

如果我们使用Redis多线程就可以分摊Redis同步读写IO的压力,以及充分利用多核CPU资源,并且可以有效的提升Redis的QPS。在Redis中虽然使用了IO多路复用,并且是基于非阻塞的IO进行操作的,但是IO的读写本身是阻塞的。比如当socket中有数据时,Redis会先将数据从内核态空间拷贝到用户态空间,然后再进行相关操作,而这个拷贝过程是阻塞的,并且当数据量越大时拷贝所需要的的时间就越多,而这些操作都是基于单线程完成的。

因此在Redis6.0中新增了多线程的功能来提高IO的读写性能,它的主要实现思路是将主线程的IO读写任务拆分给一组独立的线程去执行,这样就可以使用多个socket的读写并行化了,但Redis的命令依旧是主线程串行执行的。

但是注意:Redis6.0是默认禁用多线程的,但可以通过配置文件redis.conf中的io-threads-do-reads 等于 true 来开启。但是还不够,除此之外我们还需要设置线程的数量才能正确地开启多线程的功能,同样是修改Redis的配置,例如设置 io-threads 4,表示开启4个线程。

【关于线程数的设置,官方的建议是如果为4核CPU,那么设置线程数为2或3;如果为8核CPU,那么设置线程数为6.总之线程数一定要小于机器的CPU核数,线程数并不是越大越好。】

关于Redis的性能,Redis的作者在2019年的RedisConf大会上提到,Redis6.0引入的多线程IO特性对性能的提升至少是一倍以上。国人也有在阿里云使用4个线程的Redis版本和单线程的Redis进行比较测试,发现测试结果和Redis作者说的一致,性能基本可以提高一倍。

总结

本文介绍了Redis在4.0之前单线程依然快的原因:基于内存操作、数据结构简单、IO多路复用和非阻塞IO、避免了不必要的线程上下文切换。并且在Redis4.0开始支持多线程,主要体现在大数据的异步删除方面,例如:unlink key、flushdb async、flushall async等。而Redis6.0的多线程则增加了对IO读写的并发能力,用于更好的提升Redis的性能。

以上是“redis属于单线程还是多线程”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: redis属于单线程还是多线程

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

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

猜你喜欢
  • redis属于单线程还是多线程
    小编给大家分享一下redis属于单线程还是多线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis4.0之前是单线程运行的...
    99+
    2024-04-02
  • Redis是单线程还是多线程
    Redis是单线程的,即所有的操作都是由一个线程来处理的。这是因为Redis主要使用内存来存储数据,而内存访问速度非常快,所以单线程...
    99+
    2024-04-09
    Redis
  • nodejs多线程还是单线程
    Node.js 多线程还是单线程?在开发领域中,Node.js 的居民们时常被问到这个问题:Node.js 多线程还是单线程? 我们来一探究竟。Node.js 是一个开放源代码、跨平台的、基于 Chrome V8 引擎建立的 JavaScr...
    99+
    2023-05-17
  • golang是多线程还是单线程
    golang 是一种多线程语言。它使用轻量级的协程作为并发原语,可以充分利用多核 cpu 的优势。协程由 go 调度程序管理,负责分配 cpu 时间片和协调协程执行。 Golang是多...
    99+
    2024-04-21
    golang go语言
  • javascript指的是单进程还是多线程
    这篇文章将为大家详细讲解有关javascript指的是单进程还是多线程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 javascript是单...
    99+
    2024-04-02
  • redis是单线程分析
    这篇文章主要介绍redis是单线程分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!以前一直有个误区,以为:高性能服务器  一定是 多线程来实现的原因很简单因为误区二导致的...
    99+
    2024-04-02
  • 什么是Redis多线程
    这篇文章主要介绍“什么是Redis多线程”,在日常操作中,相信很多人在什么是Redis多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Redis多线程”的疑惑有所帮...
    99+
    2024-04-02
  • redis是不是多线程的
    小编给大家分享一下redis是不是多线程的,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!redis是单线程,单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有...
    99+
    2024-04-02
  • redis是单线程的原因
    本篇文章给大家分享的是有关redis是单线程的原因,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。redis简介是一个key-value存储系统...
    99+
    2024-04-02
  • 多线程是并发还是并行
    所谓进程(process)就是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。进程中所包含的一个或多个执行单元称为线程(thread)。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。线程只能归...
    99+
    2018-07-26
    java教程 java
  • redis中的单线程是什么
    redis中的单线程是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。官方FAQ表示,因为Redis是基于内存的操作,CPU...
    99+
    2024-04-02
  • 关于Redis单线程的正确理解
    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。 一、R...
    99+
    2024-04-02
  • Redis使用单线程为什么还这么快
    这篇文章将为大家详细讲解有关Redis使用单线程为什么还这么快,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis为什么用单线程?多线程的开销通常情况下,在采用多线程后,如果没有良好的系统设计,其实是...
    99+
    2023-06-29
  • redis的操作是多线程的
    redis的多线程性使redis服务器可以同时处理来自多个线程的请求,提高了并发处理能力和降低了延迟。redis通过使用i/o多路复用技术实现多线程性,允许单个线程监视多个套接字文件描述...
    99+
    2024-04-20
    redis
  • 基于C#实现端口扫描器(单线程和多线程)
    目录一、新建项目并设置界面二、单线程实现端口扫描1. 编写代码2. 运行结果三、多线程实现端口扫描1. 编写代码2. 运行结果四、总结一、新建项目并设置界面 新建项目: 选择Wind...
    99+
    2024-04-02
  • swoole协程是进程还是线程
    今天小编给大家分享一下swoole协程是进程还是线程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。swoole协程是属于线程...
    99+
    2023-06-29
  • redis中单线程指的是什么
    小编给大家分享一下redis中单线程指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!那么为什么Redis是单线程的我们首...
    99+
    2024-04-02
  • 为什么说redis是单线程的
    这篇文章主要介绍为什么说redis是单线程的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久...
    99+
    2024-04-02
  • redis多线程怎么用
    redis 支持多线程操作,以提高并发性和吞吐量。使用pubsub机制,可以在线程之间发送和接收消息;通过线程池,可以高效分配和管理预先创建的线程。注意事项包括线程安全、使用相同redi...
    99+
    2024-05-21
    redis
  • redis服务中的单线程是什么
    redis服务中的单线程是什么?可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。redis是以socket方式通信,socket服务端可同时接受多个客户...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作