当前位置: 首页 > 面试题库 >

Redis是单线程的,那么它如何执行并发I / O?

干亮
2023-03-14
问题内容

为了掌握Redis的一些基础知识,我遇到了一篇有趣的博客文章。

作者指出:

Redis是具有epoll / kqueue的单线程,并且在I / O并发方面可以无限​​扩展。

我肯定会误解整个线程问题,因为我发现此语句令人困惑。如果程序是单线程的,它如何并发执行任何操作?如果服务器仍然是单线程的,为什么Redis操作是原子的那么好呢?

有人可以阐明这个问题吗?


问题答案:

好吧,这取决于您如何定义并发。

在服务器端软件中,并发性和并行性通常被视为不同的概念。在服务器中,支持并发I /
O意味着服务器能够通过仅使用一个计算单元执行与那些客户端相对应的多个流来为多个客户端提供服务。在这种情况下,并行性意味着服务器能够同时执行多个操作(使用多个计算单元),这是不同的。

例如,调酒师能够照顾几个顾客,而一次只能准备一种饮料。因此,他可以在没有并行的情况下提供并发。

通过使用I / O(解复用)机制和事件循环(Redis所做的事情),单线程程序肯定可以在I / O级别上提供并发性。

并行性是有代价的:由于您可以在现代硬件上找到多个插槽/多个内核,因此线程之间的同步非常昂贵。另一方面,像Redis这样的高效存储引擎的瓶颈通常是网络,远早于CPU。因此,孤立的事件循环(不需要同步)被视为构建高效,可伸缩服务器的良好设计。

Redis操作是原子的这一事实完全是单线程事件循环的结果。有趣的一点是原子性是免费提供的(不需要同步)。用户可以利用它来实现乐观锁定和其他模式,而无需支付同步开销。



 类似资料:
  • 我肯定误解了整个线程的事情,因为我觉得这个说法令人费解。如果一个程序是单线程的,它如何并发地执行任何操作?如果服务器是单线程的,那么为什么Redis操作是原子的呢? 谁能解释一下这个问题吗?

  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

  • 本文向大家介绍Redis 为什么是单线程的?相关面试题,主要包含被问及Redis 为什么是单线程的?时的应答技巧和注意事项,需要的朋友参考一下 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且

  • 我目前正在尝试了解Redis的一些基本实现内容。我知道redis是单线程的,我已经偶然发现了以下问题:redis是单线程的,那么它是如何做并发I/O的呢? 但我还是觉得我没理解对。Afaik Redis使用一个单线程使用reactor模式。因此,如果我正确理解了这一点,那么有一个观察者(它处理FDS/传入/传出连接)将要完成的工作委托给它的注册事件处理程序。他们做实际工作并设置。他们的响应作为事件

  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 问题内容: 根据我一直在阅读的定义: 线程基本上是并发(同时)运行的代码段 。 但是,如何在存在线程调度程序的情况下同时运行它们? 我读到,线程调度程序基本上是从线程池中随机选择一个线程在某个时刻运行。从中我得到一个确切的时间点,只有一个可运行线程真正处于运行状态(运行)。( 所有这些均来自SCJP Sun认证程序员学习指南 )有人可以澄清吗? 这些线程是否真正同时运行? 问题答案: 但是,如何在