https://segmentfault.com/a/1190000009695841
redis单线程
进程和线程的学习
redis为什么是单线程?
因为CPU不是redis的瓶颈,redis的瓶颈最可能是内存和网络带宽。
万一CPU成了redis的瓶颈了或者不想浪费CPU多核,多开几个redis进程
靠开多线程反而会把开销浪费在加锁,miss cache,很多数据结构也不能实现无锁,而且异步服务的状态和设计比较下更复杂。相比较多进程,单线程的模式在性能和代码设计带来的优势更明显
Redis采用的是基于内存(速度非常快),高吞吐,其他定义就不扯了。
这取决于你如何定义并发:
并发和并行通常被认为是不同的概念,有什么区别?
1、并发性I/O流,意味着能够让一个计算单元来处理来自多个客户端的流请求。
2、并行性,意味着服务器能够同时执行几个事情(具有多个计算单元),这是不同的。
例如,酒吧能够服务几个顾客,同时他只能一次准备一个饮料。所以他可以提供没有并行性的并发服务。
Redis虽然是单线程程序,但可以通过使用I / O多路复用同一个线程和事件循环在I / O级别上提供并发性。
像Redis这样的高效存储引擎的瓶颈通常是网络,在CPU之上。
因此,Redis原子性(隔离事件循环)在没有额外成本的情况下提供并发性(不需要进程、线程同步),无需支付同步开销。
并行性有一个代价:现在硬件设备都是多核,当然多核速度肯定比单核效率高,但进程线程之间的同步是非常昂贵的。
好比,人家redis只要一台服务器可以搞定的事情,你干嘛一定要让我使用多台服务器。它轻巧,可作为构建高效可扩展的服务器,何必纠结一定要装波音747的发动机(对应的设计比较复杂),redis设计有它自己架构的好处!
官网也说了,要发挥多核CPU性能,可以通过在单机开多个Redis core实例来完善,一样实现分布式;
单线程指的是网络请求模块使用了一个线程,其他模块用了多个线程。
可能因为用了异步IO模型,单线程的效率已经足够高了。
单线程指的是网络请求模块使用了一个线程,其他模块用了多个线程。
可能因为用了异步IO模型,单线程的效率已经足够高了。
单纯的网络IO来说,量大到一定程度之后,多线程的确有优势——但并不是单纯的多线程,而是每个线程自己有自己的epoll这样的模型,也就是多线程和multiplexing混合。
一般这个开头我们都会跟一个“但是”。
但是。
还要考虑Redis操作的对象。它操作的对象是内存中的数据结构。如果在多线程中操作,那就需要为这些对象加锁。最终来说,多线程性能有提高,但是每个线程的效率严重下降了。而且程序的逻辑严重复杂化。
要知道Redis的数据结构并不全是简单的Key-Value,还有列表,hash,map等等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象,等等。这些操作还可以合成MULTI/EXEC的组。这样一个操作中可能就需要加非常多的锁,导致的结果是同步开销大大增加。这还带来一个恶果就是吞吐量虽然增大,但是响应延迟可能会增加。
Redis在权衡之后的选择是用单线程,突出自己功能的灵活性。在单线程基础上任何原子操作都可以几乎无代价地实现,多么复杂的数据结构都可以轻松运用,甚至可以使用Lua脚本这样的功能。对于多线程来说这需要高得多的代价。
链接:https://www.zhihu.com/question/23162208
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。