文档章节

高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

mikechen优知
 mikechen优知
发布于 2018/12/17 18:21
字数 1554
阅读 1.3K
收藏 0

Redis的高并发和快速原因

1.redis是基于内存的,内存的读写速度非常快;
2.redis是单线程的,省去了很多上下文切换线程的时间;
3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。

下面重点介绍单线程设计和IO多路复用核心设计快的原因。

为什么Redis是单线程的
1.官方答案
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

2.性能指标
关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

3.详细原因
1)不需要各种锁的性能消耗
Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

2)单线程多进程集群方案
单线程的威力实际上非常强大,每核心效率也非常高,多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的。

所以单线程、多进程的集群不失为一个时髦的解决方案。

3)CPU消耗

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。但是如果CPU成为Redis瓶颈,或者不想让服务器其他CUP核闲置,那怎么办?可以考虑多起几个Redis进程,Redis是key-value数据库,不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。

Redis单线程的优劣势

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

2)单进程单线程弊端
无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善。

IO多路复用技术
redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。

多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

Redis高并发快总结

  1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。
  2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。
  3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
  4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
  5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

以上就是redis高并发快的详解。

我是mike,原BAT高级研发经理、架构师,每日分享bat架构+面试真经+技术干货!

觉得不错请点赞支持,欢迎留言或进我的个人群179961551领取【架构资料专题目合集90期】、【BATJTMD大厂JAVA面试真题1000+】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不定期答题、探讨。

© 著作权归作者所有

mikechen优知
粉丝 110
博文 49
码字总数 82867
作品 0
徐汇
架构师
私信 提问
加载中

评论(0)

一篇文章彻底搞懂“分布式事务”

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免。 本篇文章将通过详解分布式事务的...

mikechen优知
2019/11/22
133
0
redis为什么会有高并发问题

http://redisbook.readthedocs.io/en/latest/ redis为什么会有高并发问题 redis的出身决定 redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身...

writeademo
2016/09/14
107
0
Redis单线程优势

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

沈渊
2017/11/12
0
0
Memcached, Redis, MongoDB区别

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。 和memcached更为接近...

雍雍_yoyo
2016/03/01
97
0
单线程多路复用和多线程加锁的区别(Redis)

单线程多路复用和多线程加锁的区别 unix linux c golang Deen 2015年11月21日提问 关注 9 关注 收藏 1 收藏,776 浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键...

tantexian
2016/06/06
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Rails中的ERB中的<%,<%=,<%#和-%>有什么区别?

能否请您描述一下ERB文件中使用的以下字符的用法: <% %><%= %><% -%><%# %> 每个有什么用? #1楼 Rails默认不使用stdlib的ERB ,而是使用erubis 。 资料来源: 该开发人员的评论 ...

javail
26分钟前
50
0
九型人格测试,看游戏人物性格制作

作为一个资深的宅男&游戏玩家,也算阅人无数,额,具体的说,应该是阅游戏里的人物角色无数,游戏中不管是NPC,还是玩家扮演的角色,都有这个人物自己的性格,根据剧情,我们可以判断出这个人...

蛤蟆丸子
33分钟前
50
0
聊聊skywalking的MemoryProvider

序 本文主要研究一下skywalking的MemoryProvider MemoryProvider skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryPro......

go4it
34分钟前
33
0
ServiceLoader

1: ServiceLoader 使用简介 java 优雅地获取接口实现 2:Java ServiceLoader使用和解析 3:spring-boot-starter原理及实现方法...

whoisliang
37分钟前
48
0
SpringCloud Feign 配置token请求

相关依赖引入 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> ......

IT-Mamba
39分钟前
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部