Redis为什么是单线程,高并发快由哪些因素决定?

redis的高并发和快速原因
1.Redis基于内存 , 内存的读写速度非常快;
2.Redis是单线程的 , 为上下文切换线程节省了大量时间;
3.Redis使用多路复用技术来处理并发连接 。非阻塞IO的内部实现使用epoll , 以及由epoll +本身实现的简单事件框架 。epoll中的读取 , 写入 , 关闭和连接都被转换为事件 , 然后使用epoll的多路复用功能从不浪费任何时间在io上 。
【Redis为什么是单线程,高并发快由哪些因素决定?】 
以下内容重点介绍单线程设计和IO多路复用核心设计快的原因 。

Redis为什么是单线程,高并发快由哪些因素决定?

文章插图
 
为什么Redis是单线程的?
1.官网回答
由于Redis是基于内存的操作 , 因此CPU并不是Redis的瓶颈 。Redis的瓶颈很可能是机器内存或网络带宽的大小 。既然单线程易于实现并且CPU不会成为瓶颈 , 那采用单线程解决方案是合乎逻辑的了 。
2.性能指标
关于redis的性能 , 官方网站也有介绍 , 普通笔记本可以轻松地每秒处理数十万个请求 。
3.详细原因
1)不需要各种锁的性能消耗
Redis的数据结构并非全都是简单的键值(Key-Value) , 而是有复杂的结构 , 如列表(list)和哈希(hash) 。这些结构可以执行细粒度的操作 , 例如在长列表后面添加元素并将其添加到哈希(hash)或删除对象 。
这些操作可能需要非常大量的锁 , 从而导致同步开销显着增加 。简而言之 , 在单线程的情况下 , 不需要考虑各种锁 , 没有锁释放操作 , 也没有由于可能的死锁而导致的性能消耗 。
2)单线程多进程集群方案
单线程的功能实际上非常强大 , 每个内核的效率也很高 。与单线程相比 , 多线程自然可以具有更高的性能限制 。但是 , 在当今的计算环境中 , 甚至单机多线程限制通常也无法满足 。需要进一步探索的是多服务器群集方案 , 并且这些方案中的多线程技术仍然是不可用的 。
所以单线程、多进程的集群不失为一个时髦的解决方案 。
3)CPU消耗
单线程用于避免不必要的上下文切换和竞争条件 , 并且不存在消耗CPU的多进程或多线程切换 。但是 , 如果CPU成为Redis的瓶颈 , 或者不想让服务器的其他CPU内核闲置怎么办? 您可以考虑几个Redis进程 。Redis是一个键值(key-value)数据库 , 而不是关系数据库 , 并且数据之间没有约束 。只要客户端能够区分哪个键位于哪个Redis进程上 , 就可以完成了 。
 
Redis单线程的优劣势
单进程单线程优势
代码更清晰 , 处理逻辑也更简单 。无需考虑各种锁 。没有锁定释放操作 。由于可能存在死锁 , 因此不会降低性能 。没有由多进程或多线程消耗的CPU引起的切换
单进程单线程弊端
无法利用多核CPU的性能 , 但可以通过在单台计算机上打开多个Redis实例来提高性能;
IO多路复用技术
当有多个连接时 , Redis使用网络IO多路复用技术来确保系统的高吞吐量 。多路复用是指多个socket连接 , 而多路复用是指对线程进行多路复用 。
多路复用主要有三种技术:select , poll , epoll 。epoll是目前最新的也是最好的多路复用技术了 。
“多路复用”是指多个网络连接 , “多路复用”是指多路复用同一线程 。使用多个I / O多路复用技术可以使单个线程有效地处理多个连接请求(最大程度地减少网络IO的时间消耗) , 并且Redis可以非常快速地操作内存中的数据(这里的内存操作不会成为性能瓶颈) , 以上两个 要点使Redis具有很高的吞吐量 。
Redis为什么是单线程,高并发快由哪些因素决定?

文章插图
 
Redis高并发快总结
Redis为什么是单线程,高并发快由哪些因素决定?

文章插图
 
1. Redis是一个纯内存数据库 , 通常是一个简单的存取操作 ,  线程占用大量时间 。时间主要集中在IO上 , 因此读取速度很快 。
2. 谈到IO , Redis使用非阻塞IO , IO多路复用 , 使用单个线程轮询描述符 , 将数据库的开、关、读、写都转换成了事件 , 从而减少了线程切换上下文的切换和竞争 。


推荐阅读