Redis为什么是单线程、及⾼并发快

337 阅读5分钟

1. ⾯试题分析

  • Redis的⾼并发和快速原因
  • 为什么Redis是单线程的
  • Redis单线程的优劣势
  • IO多路复⽤技术
  • Redis⾼并发快总结

分析需要全⾯并且有深度 容易被忽略的坑

  • 分析⽚⾯
  • 没有深⼊

2. Redis的⾼并发和快速原因

  1. redis是基于内存的,内存的读写速度⾮常快;
  2. redis是单线程的,省去了很多上下⽂切换线程的时间;
  3. redis使⽤多路复⽤技术,可以处理并发的连接。⾮阻塞IO 内部实现采⽤epoll,采⽤了epoll+⾃⼰实现 的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利⽤epoll的多路复⽤特性,绝 不在io上浪费⼀点时间。 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进程上就可以了。

3. Redis单线程的优劣势

  1. 单进程单线程优势
    1. 代码更清晰,处理逻辑更简单
    2. 不⽤去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁⽽导致的性能消耗
    3. 不存在多进程或者多线程导致的切换⽽消耗CPU
  2. 单进程单线程弊端
    1. ⽆法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

4. IO多路复⽤技术

redis 采⽤⽹络IO多路复⽤技术来保证在多连接的时候, 系统的⾼吞吐量。
多路-指的是多个socket连接,复⽤-指的是复⽤⼀个线程。多路复⽤主要有三种技术:select,poll, epoll。epoll是最新的也是⽬前最好的多路复⽤技术。
这⾥“多路”指的是多个⽹络连接,“复⽤”指的是复⽤同⼀个线程。采⽤多路 I/O 复⽤技术可以让单个线程⾼效的处理多个连接请求(尽量减少⽹络IO的时间消耗),且Redis在内存中操 作数据的速度⾮常快(内存内的操作不会成为这⾥的性能瓶颈),主要以上两点造就了Redis具有很⾼的 吞吐量。

image.png

5. Redis⾼并发快总结

  1. Redis是纯内存数据库,⼀般都是简单的存取操作,线程占⽤的时间很多,时间的花费主要集中在 IO上,所以读取速度快。
  2. 再说⼀下IO,Redis使⽤的是⾮阻塞IO,IO多路复⽤,使⽤了单线程来轮询描述符,将数据库的 开、关、读、写都转换成了事件,减少了线程切换时上下⽂的切换和竞争。
  3. Redis采⽤了单线程的模型,保证了每个操作的原⼦性,也减少了线程的上下⽂切换和竞争。
  4. 另外,数据结构也帮了不少忙,Redis全程使⽤hash结构,读取速度快,还有⼀些特殊的数据结 构,对数据存储进⾏了优化,如压缩表,对短数据进⾏压缩存储,再如,跳表,使⽤有序的数据结 构加快读取的速度。
  5. 还有⼀点,Redis采⽤⾃⼰实现的事件分离器,效率⽐较⾼,内部采⽤⾮阻塞的执⾏⽅式,吞吐能 ⼒⽐较⼤。
  6. 扩展内容
  • Redis缓存和MySQL数据⼀致性的解决⽅案
  • Redis哨兵、复制、集群的设计原理及区别
  • 如何解决Redis缓存雪崩、缓存穿透、缓存并发等难题
  • Redis的内存回收原理,及Redis内存过期淘汰策略
  • Redis并发竞争key的解决⽅案