关注公众号,一起交流,微信搜一搜: 潜行前行

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



欢迎指正文中错误

参考文章

最新文章

  1. SharePreference 工具类封装
  2. Linq学习工具及Lamada表达式
  3. 《DSP using MATLAB》示例Example4.10
  4. C# 类型基础——你可能忽略的技术细节
  5. Linux字符串替换一例:根据IP地址获取指定内容
  6. many to one could not resolve property
  7. Zookeeper工作原理
  8. 多线程同步循环打印和Guarded suspension 模式
  9. SSH转发机制
  10. js中toggle()及toggleClass()的使用详解
  11. ES6之Proxy及Proxy内置方法
  12. List Set Map比较
  13. Http协议状态码总结
  14. Linux下批量修改后缀名
  15. 线性筛prime/phi/miu/求逆元模板
  16. springboot区分开发、测试、生产多环境的应用配置(二)
  17. 水题C
  18. HDU-2586-裸LCA入门-tarjan离线
  19. 在SQL Server中使用CLR调用.NET方法
  20. 归并排序(php实现)

热门文章

  1. 【做题记录】CF1428E Carrots for Rabbits—堆的妙用
  2. RGB-YUV
  3. poj 3417 Network (LCA,路径上有值)
  4. bootstrap 4 学习笔记
  5. # Host xx.xxx.x.xxx found: line 1 /root/.ssh/known_hosts updated. Original contents retained as /root/.ssh/known_hosts.old
  6. Robot Framework操作MySQL数据库
  7. Spark中的两种模式
  8. MyBatis Plus中使用and和or
  9. yum设置取消代理
  10. Part 17 Consuming ASP NET Web Service in AngularJS using $http