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

时间:2012-05-07 21:19:16

标签: multithreading redis

试图掌握Redis的一些基础知识我遇到了一个有趣的blog post

作者声明:

  

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

我肯定会误解整个线程,因为我觉得这句话令人费解。如果程序是单线程的,它如何同时执行任何操作?如果服务器是单线程的话,为什么Redis操作是原子的呢?

有人可以就这个问题说清楚吗?

2 个答案:

答案 0 :(得分:280)

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

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

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

这个问题在这里有争议: Concurrency vs Parallelism - What is the difference?

另见Rob Pike的this presentation

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

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

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

答案 1 :(得分:16)

好的,Redis是用户级别的单线程OTOH,内核线程池和/或分层驱动程序支持所有异步I / O.

对某些人来说,

'并发'包括将网络事件分发到套接字状态机。它是单线程的,在一个核心上运行(在用户级别),因此我不会将其称为并发。其他人不同......

'在I / O并发性方面无限扩展'实际上是经济的。他们可能会更加相信,如果他们说'可以比每个客户一个线程更好地扩展,只要客户不要求太多',尽管他们可能会觉得有必要添加'被其他异步解决方案重载在用户级使用所有核心'。