写点什么

Redis 线程模型

作者:javaadu
  • 2022 年 3 月 16 日
  • 本文字数:714 字

    阅读完需:约 2 分钟

Redis线程模型

​Redis 真的是单线程吗?

我们一般说 Redis 是单线程,是指 Redis 的网络 IO 和键值对操作是一个线程完成的,这就是 Redis 对外提供键值存储服务的主要流程。Redis 的其他功能,例如持久化、异步删除、集群数据同步等等都是由额外的线程去做的。当我们说“Redis 是单线程高性能的存储”的时候,无非是说法上感觉比较酷😎。


Redis 为啥用单线程?

官方说法是:由于 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈可能是机器内存的大小或网络带宽。既然 CPU 不是瓶颈,再加上多线程并发还存在共享资源抢占造成的问题,就选择简单的单线程方案了。这个在软件设计中的思路就是,能用简单的方案解决问题就不要玩花活。


单线程 Redis 为啥这么快?

普通 IO 模型

对于 Redis 线程来说,普通的网络 IO 模型处理主要分为 bind/listen、accept、recv、parse 等操作,其中 accept 和 recv 两个操作可能是阻塞点:

  • accept:当线程在等待别的请求的时候,就不做其他的事情;

  • recv:当线程在等待数据传输完成的时候,也不做其他事情



高性能 IO 模型

随着 Linux 网络编程技术的发展,为了提升效率,逐步引入了 IO 多路复用+异步非阻塞模式:

  • IO 多路复用,指的是网络处理线程可以同时监听几个 FD 上的请求

  • 异步非阻塞模式,主要是基于事件的响应式编程模式,线程会注册回调函数到事件队列,当队列里有新的事件产生的时候,就会触发该回调函数的调用,业务的逻辑写在回调函数中


IO 多路复用+异步非阻塞模式的具体实现跟操作系统有关:

  • 基于 Linux 系统下的 select 和 epoll 实现

  • 基于 FreeBSD 的 kqueue 实现

  • 基于 Solaris 的 evport 实现



参考资料

  1. https://cloud.tencent.com/developer/article/1717352

  2. 《UNIX 网络编程》

  3. 极客时间《Redis 核心技术与实战》

  4. 《Redis 设计与实现》

  5. 《Redis 深度历险》


知识卡片



发布于: 刚刚阅读数: 2
用户头像

javaadu

关注

功不唐捐 2017.09.10 加入

蚂蚁金服后端开发者,擅长java、spring、spring boot、jvm、分布式架构、软件设计等领域的技术分享,对于风控业务有一定的了解

评论

发布
暂无评论
Redis线程模型_redis_javaadu_InfoQ写作平台