Redis篇:单线程I/O模型
2024-09-04 21:53:09
关注公众号,一起交流,微信搜一搜: 潜行前行
redis 单线程 I/O 多路复用模型
- 纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别。因此 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
欢迎指正文中错误
参考文章
最新文章
- SharePreference 工具类封装
- Linq学习工具及Lamada表达式
- 《DSP using MATLAB》示例Example4.10
- C# 类型基础——你可能忽略的技术细节
- Linux字符串替换一例:根据IP地址获取指定内容
- many to one could not resolve property
- Zookeeper工作原理
- 多线程同步循环打印和Guarded suspension 模式
- SSH转发机制
- js中toggle()及toggleClass()的使用详解
- ES6之Proxy及Proxy内置方法
- List Set Map比较
- Http协议状态码总结
- Linux下批量修改后缀名
- 线性筛prime/phi/miu/求逆元模板
- springboot区分开发、测试、生产多环境的应用配置(二)
- 水题C
- HDU-2586-裸LCA入门-tarjan离线
- 在SQL Server中使用CLR调用.NET方法
- 归并排序(php实现)
热门文章
- 【做题记录】CF1428E Carrots for Rabbits—堆的妙用
- RGB-YUV
- poj 3417 Network (LCA,路径上有值)
- bootstrap 4 学习笔记
- # Host xx.xxx.x.xxx found: line 1 /root/.ssh/known_hosts updated. Original contents retained as /root/.ssh/known_hosts.old
- Robot Framework操作MySQL数据库
- Spark中的两种模式
- MyBatis Plus中使用and和or
- yum设置取消代理
- Part 17 Consuming ASP NET Web Service in AngularJS using $http