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

2019-05-13 22:22发布

试图掌握的Redis的一些基础知识我遇到了一个有趣的来了博客文章 。

作者指出:

Redis的是单线程与epoll的/ kqueue的和在I / O的并发方面无限期比例绘制。

我肯定误解了整个线程的事情,因为我觉得这种说法令人费解。 如果一个程序是单线程的,它是如何做任何事情的同时? 为什么它是如此之大,Redis的操作都是原子,如果服务器是单线程的呢?

可能有人请阐明问题的一些轻?

Answer 1:

那么这取决于你如何定义并发。

在服务器端软件,并发和并行通常被认为是不同的概念。 在服务器中,支撑并发I / O的装置,该服务器能够通过执行对应于这些客户端仅与一个计算单元几个流服务于多个客户端。 在这种情况下,并行将意味着服务器能够在同一时间(与多个计算单元),这是不同的执行几件事。

例如,一个调酒师能够经过几个客户看,而他只能在一个时间准备一个饮料。 于是,他能提供的并发没有并行。

这个问题已经争论在这里: 并发VS并行-的区别是什么?

另见本演示由罗勃·派克。

甲单线程程序绝对可以通过使用一个I / O(解)复用机制和一个事件循环(这是Redis的做什么)在I / O级别提供的并发性。

并行性成本:与多个插槽/多核你可以找到在现代硬件,线程之间的同步是非常昂贵的。 在另一方面,像Redis的一个高效的存储引擎的瓶颈是很经常的网络,在CPU之前。 因此,分离的事件循环(其不需要同步)被看作是一个良好的设计来构建高效,可扩展的服务器。

这Redis的操作都是原子的事实仅仅是单线程事件循环的结果。 有趣的是原子在无需支付额外费用提供(它不需要同步)。 它可以由用户利用来实现乐观锁定等模式,而不用于同步开销支付。



Answer 2:

OK,Redis的是单线程的,在用户级,OTOH,所有的异步I / O是由内核线程池和/或错层驱动程序支持。

并发 ”,一些,包括分配网络事件套接字状态机。 它是单线程的,运行在一个内核上,(在用户级别),所以我不会把这种现象称为并发。 其他人的不同..

在I / O并发方面扩展无限期 ”只是具有经济性的真相。 如果他们说“可以缩放比一个线程每客户端,提供客户端不要求不高”,尽管他们可能再认为有必要增加“其他异步方案干掉了沉重的负荷,他们可能会得到更多的信念使用所有核心用户级别”。



文章来源: Redis is single-threaded, then how does it do concurrent I/O?