Redis为什么使用单进程单线程方式也这么快
[转] 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快的主要原因是:
- 完全基于内存
- 数据结构简单,对数据操作也简单
- 使用多路 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为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。
单进程单线程好处
- 代码更清晰,处理逻辑更简单
- 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
- 不存在多进程或者多线程导致的切换而消耗CPU
单进程单线程弊端
- 无法发挥多核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为什么使用单进程单线程方式也这么快相关推荐
- redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...
Java相关的面试都会问到缓存的问题,基础一点的会问到什么是"二八定律".什么是"热数据和冷数据",复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存 ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part6(Redis的应用场景、Redis是单线程的速度还快、Redis线程模型:Reactor模式、事件、发布订阅、管道)~整起
PART1-1:为什么Redis是单线程的 Redis单线程是指: Redis的网络IO和键值对读写是由一个线程来完成的.这也是 Redis 对外提供键值存储服务的主要流程.Redis的其他功能,比如 ...
- Redis(8)为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- 【Redis】到底是单线程还是多线程以及Redis为什么这么快?
文章目录 Redis到底是单线程还是多线程的? Redis为什么是单线程的? Redis为什么基于内存? 为什么要为Redis绑定某一固定CPU? Redis的多线程情况 Redis的单线程到底有多快 ...
- Redis不是号称单线程效率也很高吗,为什么又采用多线程了?
Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型. 因为我们公司使用的内存数据库是自研的,按理说我对Redi ...
- redis的两种持久化方式详解
一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...
- jedis watch Java_jedis操作redis的几种常见方式总结
Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...
- linux redis客户端_为什么单线程Redis能那么快?
我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程.但 Redis 的其他功能,比如持久化.异步 ...
- Redis的两种备份方式:RDB和AOF
在 Redis 中存在两种方式的备份:一种是快照恢复(RDB),通过快照(snapshotting)实现的,它是备份当前瞬间 Redis 在内存中的数据记录. 另一种是只追加文件(Append-Onl ...
最新文章
- AI 识别抑郁症正确率高达八成,但AI+精神健康还有很长的路要走
- mysql正则提取字符串_mysql字符串查找截取与正则表达式的联合应用
- 20个安全可靠的免费数据源,各领域数据任你挑
- redhat enterprise 5 在 VMware 6.5 中中文显示乱码的解决办法
- 休眠事实:如何“断言” SQL语句计数
- 网站重新解析换服务器,更换解析服务器地址
- leetcode127. Word Ladder
- Python Web开发
- java利用梦网云通讯发送短信
- 4、配置虚拟机IP地址
- 假设检验与常见的统计检验方法
- 所有小米机型 解BT+刷Magisk并ROOT+躲避应用ROOT环境检查教程
- directadmin安装
- HTML+CSS静态页面游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
- APISpace 中文分词API
- SATA系列专题之六:浅析NCQ原生指令序列
- 笔试题-武汉珞珈德毅笔试题
- Elasticsearch7.6(windows版单机版)api使用及JD搜索高亮显示
- Mac磁盘工具无法将APFS硬盘转化为txFAT格式的解决办法
- 用VScode编写LaTex-最新教程2022/4/17