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

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

作者指出:

Redis与epoll / kqueue是单线程的,并且在I / O并发性方面无限期地扩展。

我肯定误解了整个线程的事情,因为我觉得这个说法令人费解。 如果一个程序是单线程的,它是如何同时执行的? 如果服务器是单线程的话,为什么Redis操作是非常棒的呢?

请问任何人都可以解释一下这个问题?

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

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

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

这个问题已经在这里辩论: 并发VS并行 – 有什么区别?

请参阅Rob Pike的演示文稿 。

单线程程序可以通过使用I / O(de)多路复用机制和事件循环(这是Redis所做的)来明确地提供I / O级别的并发性。

并行性的代价是:在现代硬件上可以find多个插槽/多个内核,线程之间的同步是非常昂贵的。 另一方面,像Redis这样的高效存储引擎的瓶颈往往是在CPU之前的networking。 独立的事件循环(不需要同步)因此被认为是构build高效,可扩展的服务器的好devise。

Redis操作是primefaces的事实只是单线程事件循环的结果。 有趣的一点是primefaces性是提供在没有额外的成本(它不需要同步)。 它可以被用户利用来实现乐观locking和其他模式,而不需要花费同步开销。

好的,Redis在用户级OTOH中是单线程的,所有asynchronousI / O都由内核线程池和/或分级驱动程序支持。

对一些人来说,“ 并发 ”包括将networking事件分发给套接字状态机。 它是单线程的,运行在一个核心上,(在用户级别),所以我不会将其称为并发。 其他不同..

就I / O并发而言,无限规模 ”对于事实来说是经济的。 如果他们认为“可以比单线程的客户更好,客户不要求太多”,他们可能会得到更多的信任,尽pipe他们可能觉得有必要加上“被其他asynchronous解决scheme使用用户级别的所有核心“。