为什么Memcache使用多线程
回答两者的优缺点,再随便补充一点个人理解就可以。
先回答Redis使用单线程模式的原因。
Redis使用单线程模式的理由有很多。首先有两个显著的优点:不会引入上下文切换的开销,也没有多线程访问资源的竞争问题。其次,Redis是一个内存数据库,操作很快,所以它的性能瓶颈只可能出现在网络IO和内存大小上,是不是多线程影响不大。最后,单线程模式比较好理解,调试起来也容易。
紧接着回答Memcache的设计。
Memcache采用了多线程设计,那么带来的后果就是会有线程上下文切换的开支,并且多线程模式下需要引入锁来保护共享资源。优点则是Memcache会比Redis更充分地利用多核CPU的性能。
毕竟我们都不是 Redis 的设计者,也难以说清楚究竟是什么因素促使设计者下定决心使用单线程模型。下面的这一段话是我的个人理解,你可以替换成你自己的思考。
我之前注意到有些人在网上发布了 Redis 和 Memcache 的性能对比。基本上就是有些时候 Redis 好一点,有些时候 Memcache 好一点。 我就觉得既然 Redis 用单线程模型都能取得这种不相上下的性能表现,就说明 Redis 的选择还是很正确的。即便如此,后面 Redis 在 6.0 的时候,还是引入了多线程模型,期望进一步利用多核 CPU 的优势。
Redis为什么引入多线程
引入多线程的原因只有一个,那就是性能。
Redis在6.0引入多线程的原因只有一个,在高并发场景下可以利用多个线程并发处理IO任务、命令解析和数据回写。这些线程也被叫做IO线程。默认情况下,多线程模式是被禁用了的,需要显式的开启。
当然要想答好这个问题,你不能只解释为什么引入多线程,还要结合 Reactor 和 epoll 来解释在启用了多线程模型之后,Redis 是如何运作的。如果刨除 Redis 主线程和 IO 线程之间的交互细节,那么多线程模式下的 Redis 的 Reactor 和 epoll 结合在一起的形式就是像图片里展示的这样。