redis为什么快

redis是基于内存的,内存的读写速度非常快

redis是单线程的,省去了很多上下文切换线程的时间

  • 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
  • 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求
  • Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的上下文切换而消耗 CPU

redis使用IO多路复用技术

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

单进程单线程优势

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

单进程单线程弊端

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

为什么Redis 6.0引入了多线程

Redis 6.0中的多线程,也只是针对处理网络请求过程采用了多线程,而数据的读写命令,仍然是单线程处理的。 

不是说多路复用技术已经大大的提升了I0利用率了么,为啥还需要多线程?

而经过分析,限制Redis的性能的主要瓶颈出现在网络I0的处理上,虽然之前采用了多路复用技术。但是我们前面 也提到过,多路复用的I0模型本质上仍然是同步阻塞型I0模型

如果能采用多线程,使得网络处理的请求并发进行,就可以大大的提升性能。多线程除了可以减少由于网络 I/0等待造成的影响,还可以充分利用 CPU 的多核优势。
所以,Redis 6.0采用多个I0线程来处理网络请求,网络请求的解析可以由其他线程完成,然后把解析后的请求交由主线程进行实际的内存读写。提升网络请求处理的并行度,进而提升整体性能。

总之:Redis 的多I/O线程只是用来处理网络请求的,对于读写命令,Redis 仍然使用单线程来处理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值