Redis篇:单线程 Reactor 模型

存储 Redis
纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别。因此 redis 进程的 cpu 基本不存在磁盘 I/O 等待时间、内存读写性能问题,CPU 不是 redis 的瓶颈(内存大小和网络I/O 才是 redis 的瓶颈,也就是客户端和服务端之间的网络传输延迟)。

redis 的高性能

  • 纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别。因此 redis 进程的 cpu 基本不存在磁盘 I/O 等待时间、内存读写性能问题,CPU 不是 redis 的瓶颈(内存大小和网络I/O 才是 redis 的瓶颈,也就是客户端和服务端之间的网络传输延迟)
  • 采用单线程模型,单线程实现简单。避免了多线程频繁上下文切换,以及同步机制加锁带来的开销
  • 简单高效的基础数据结构:动态字符串(SDS),链表,字典,跳跃链表,整数集合和压缩列表。然后 redis 在这个基础上去实现用户能操作的对象:字符串,列表,哈希,集合,有序集合等对象
  • reactor 模式的网络事件处理器。它使用了 I/O 多路复用去同时监控多个套接字,这是一种高效的I/O模型。reactor 相关知识可以看下这篇文章 框架篇:见识一下linux高性能网络IO+Reactor模型

为什么使用单线程

采用单线程,避免了不必要的上下文切换和竞争条件;不存在多线程导致的切换而消耗CPU

不用考虑各种锁的问题,不存在加锁和释放锁的的操作,没有因为可能出现的死锁而导致的性能消耗

简单可维护,多线程模式会使得程序的编写更加复杂和麻烦,单线程实现易实现

redis 是单线程系统?

我们常说 redis 单线程是指其网络事件处理模型 reactor 是单线程

如果一次 client 请求会删除几百万 keys 值,那么这条命令可能会导致阻塞。在 redis 4.0 选择引入多线程来实现这一类非阻塞的命令

在 redis6.0 版本正式引入多线程去处理客户端的 I/O 读写响应,而 redis 命令事件的处理还是在主线程单线处理

假如是针对整个 redis 系统,则一直有其他线程去处理异步任务,如 AOF、RDB 的同步

redis I/O模型

redis 处理快,不单单因为它是个单线程纯内存系统,还有它采用了 Reactor 模型,使用 I/O 多路复用来实现对外部请求的处理,减少网络连接、读写等待时间。使其在网络 I/O 操作中能并发处理大量的客户端请求,实现高吞吐率,高并发

redis 的多线程版本I/O模型 6.0

参考文章

 

  • Redis深入系列-线程IO模型1
  • Redis 多线程网络模型全面揭秘

 

责任编辑:武晓燕 来源: 潜行前行
相关推荐

2010-01-28 16:45:44

Android单线程模

2009-07-10 09:05:20

SwingWorker

2019-11-25 10:13:52

Redis单线程I

2024-09-27 11:51:33

Redis多线程单线程

2019-06-17 14:20:51

Redis数据库Java

2020-10-30 16:20:38

Redis单线程高并发

2020-06-11 09:35:39

Redis单线程Java

2023-10-15 12:23:10

单线程Redis

2023-08-17 14:12:17

2020-11-09 09:33:37

多线程

2023-03-21 08:02:36

Redis6.0IO多线程

2022-09-29 15:39:10

服务器NettyReactor

2010-08-30 08:55:56

JavaScript引

2024-10-24 20:48:04

Netty线程Java

2023-12-01 08:18:24

Redis网络

2019-05-06 11:12:18

Redis高并发单线程

2019-05-07 09:44:45

Redis高并发模型

2020-09-23 13:37:25

Redis6.0

2020-11-17 10:20:53

Redis多线程单线程

2017-03-06 14:08:38

JavaScript单线程setTimeout
点赞
收藏

51CTO技术栈公众号