本贴最后更新于 850 天前,其中的信息可能已经事过境迁

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

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

我总结几点 redis 为什么要设计成单线程的原因

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

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


粗浅理解,欢迎拍砖

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    131 引用 • 186 回帖 • 916 关注
  • 单线
    1 引用
  • 线程
    77 引用 • 80 回帖
感谢    关注    收藏    赞同    反对    举报    分享