[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。

Redis快的主要原因是:

  1. 完全基于内存
  2. 数据结构简单,对数据操作也简单
  3. 使用多路 I/O 复用模型

第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。

多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

和Memcached不同,Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。在不同的系统调用选用适合的接口,linux下默认是epoll。因为Libevent比较重更通用代码量也就很庞大,拥有很多Redis用不上的功能,Redis为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。

单进程单线程好处

  1. 代码更清晰,处理逻辑更简单
  2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  3. 不存在多进程或者多线程导致的切换而消耗CPU

单进程单线程弊端

  1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

其他一些优秀的开源软件采用的模型

  • 多进程单线程模型:Nginx
  • 单进程多线程模型:Memcached

参考链接

  • https://en.wikipedia.org/wiki/Epoll
  • https://segmentfault.com/a/1190000003063859#articleHeader6
  • [http://www.ibm.com/developerworks/cn/linux/l-async/]http://www.ibm.com/developerworks/cn/linux/l-async/
  • http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html

转载于:https://www.cnblogs.com/xifenglou/p/9377454.html

Redis为什么使用单进程单线程方式也这么快相关推荐

  1. redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...

    Java相关的面试都会问到缓存的问题,基础一点的会问到什么是"二八定律".什么是"热数据和冷数据",复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存 ...

  2. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part6(Redis的应用场景、Redis是单线程的速度还快、Redis线程模型:Reactor模式、事件、发布订阅、管道)~整起

    PART1-1:为什么Redis是单线程的 Redis单线程是指: Redis的网络IO和键值对读写是由一个线程来完成的.这也是 Redis 对外提供键值存储服务的主要流程.Redis的其他功能,比如 ...

  3. Redis(8)为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  4. 【Redis】到底是单线程还是多线程以及Redis为什么这么快?

    文章目录 Redis到底是单线程还是多线程的? Redis为什么是单线程的? Redis为什么基于内存? 为什么要为Redis绑定某一固定CPU? Redis的多线程情况 Redis的单线程到底有多快 ...

  5. Redis不是号称单线程效率也很高吗,为什么又采用多线程了?

    Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型. 因为我们公司使用的内存数据库是自研的,按理说我对Redi ...

  6. redis的两种持久化方式详解

    一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...

  7. jedis watch Java_jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

  8. linux redis客户端_为什么单线程Redis能那么快?

    我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程.但 Redis 的其他功能,比如持久化.异步 ...

  9. Redis的两种备份方式:RDB和AOF

    在 Redis 中存在两种方式的备份:一种是快照恢复(RDB),通过快照(snapshotting)实现的,它是备份当前瞬间 Redis 在内存中的数据记录. 另一种是只追加文件(Append-Onl ...

最新文章

  1. AI 识别抑郁症正确率高达八成,但AI+精神健康还有很长的路要走
  2. mysql正则提取字符串_mysql字符串查找截取与正则表达式的联合应用
  3. 20个安全可靠的免费数据源,各领域数据任你挑
  4. redhat enterprise 5 在 VMware 6.5 中中文显示乱码的解决办法
  5. 休眠事实:如何“断言” SQL语句计数
  6. 网站重新解析换服务器,更换解析服务器地址
  7. leetcode127. Word Ladder
  8. Python Web开发
  9. java利用梦网云通讯发送短信
  10. 4、配置虚拟机IP地址
  11. 假设检验与常见的统计检验方法
  12. 所有小米机型 解BT+刷Magisk并ROOT+躲避应用ROOT环境检查教程
  13. directadmin安装
  14. HTML+CSS静态页面游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
  15. APISpace 中文分词API
  16. SATA系列专题之六:浅析NCQ原生指令序列
  17. 笔试题-武汉珞珈德毅笔试题
  18. Elasticsearch7.6(windows版单机版)api使用及JD搜索高亮显示
  19. Mac磁盘工具无法将APFS硬盘转化为txFAT格式的解决办法
  20. 用VScode编写LaTex-最新教程2022/4/17

热门文章

  1. 2016 版 Laravel 系列入门教程(一)
  2. DOM的appendchild在IE6、7下不兼容
  3. python各种类型日期转换大全
  4. react学习(四)之设置 css样式 篇
  5. Rails 定时任务——whenever实现周期性任务
  6. ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误
  7. Mongodb 数据模型概念
  8. 优化JS加载时间过长的一种思路
  9. Oracle数据库执行exp命令--报参数'log' 不允许有多个值
  10. 通过域名,直接访问到网站主页