[关闭]
@Toby-wei 2016-08-12T02:04:30.000000Z 字数 679 阅读 2879

redis为什么要设计成单线程

redis


我觉得最重要的一点是,redis作为一个内存数据库,内存操作是很快的。网络io是瓶颈,如果用多线程,还要引起线程切换,线程切换的开销是很大的,切换线程之后要保留现场,要做很多预处理。所以用单线程反而能起到更好的作用。

线程切换为什么开销大呢?举个简单的例子,我在看一篇文章,有个单词不认识,那我要去查词典。在查词典之前,我得要先记录我阅读到了那一页的哪一行,方便下次来继续读。那这样肯定是要影响我读书效率的。

我总结几点redis为什么要设计成单线程的原因
1. 都是通过网络来调用redis的,如果是内网调用情况稍微比外网调用好点。但是这些和内存操作的时间不是一个量级的。用单线程处理完全能应付。
2. redis是采用单线程-多路复用IO模型来实现高性能内存数据服务的。这样就避免了适用锁。网络层利用IO多路复用,这使用了内核级别的线程池,就是说还是存在并发的,只是在网络层的并发。但是网络Io本身是很慢的。是瓶颈。那么你在业务处理阶段设计再多的线程,使用再多的cpu内核,也没法逾越网络Io的瓶颈。
3. redis和传统的多线程服务器不同。比如tomcat这些,后端往往存在很重的IO操作,会产生长时间的等待。所以采用多线程是有必要的。

redis用单线程也不是没有问题。有一个很明显的问题就是。当进行一些复杂的集合操作的时候会使redis并发性下降。
解决办法是:你可以在一个多核的机器上部署多个redis实例。组成master-master,master-slave的形式,实现读写分离。耗时的读命令完全可以放到slave中。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注