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

Prz*_*icz 152 multithreading redis

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

作者说:

Redis是带有epoll/kqueue的单线程,并且在I/O并发方面无限缩放.

我肯定误解了整个线程,因为我发现这个说法令人费解.如果程序是单线程的,它如何同时执行任何操作?如果服务器是单线程的话,为什么Redis操作是原子的呢?

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

Did*_*zia 313

那么它取决于你如何定义并发.

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

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

这个问题在这里有争议: 并发与并行 - 有什么区别?

另见Rob Pike的演讲.

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

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

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

  • 好的调酒师比喻:) (117认同)
  • v4在这方面可以改变游戏规则-请在/sf/answers/3176240511/中查看我的答案:) (2认同)

Mar*_*mes 17

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

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

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