天天看点

Redis6.0使用了多线程还能保证线程安全么?-Redis6.0 多线程精讲

​​单线程模型​​

为什么引入多线程?

有很多同学就有疑问了,既然官方都表示CPU不是Redis的性能瓶颈,那么为什么还要引入多线程呢? 虽然单线程有很多优点,但对应的也必然会有一些缺点存在:

  • 只能使用CPU的单核
  • 如果删除的key过大(set 里面有一堆key),会导致服务端阻塞(后面通过LazyFree机制)
  • QPS难以提高

但是redis并没有直接上多线程IO去处理这些,而是在多线程之前引入了LazyFree机制

引入多线程的优点

  • 充分利用CPU资源
  • 多线程任务有利于分担Redis同步IO读写的负荷

LazyFree

lazyFree 主要包括有:flushDb操作,flushall,berewriteaof,删除大key等操作,采用多线程去单独做这些事情,主线程只负责关系的解除,子线程在后台默默的异步执行这些耗时的操作。

多线程模型

Redis6.0使用了多线程还能保证线程安全么?-Redis6.0 多线程精讲
  • 主线程接收到客户端的连接请求,获取socket放入等待队列
  • 主线程判断等待队列已满,则通过轮询的方式,将这些连接分配给线程组
  • 主线程等待IO线程执行读取socket完毕
  • IO线程读取socket完毕之后,主线程开始执行redis命令
  • 将执行结果写入缓冲区
  • 阻塞等待IO线程将数据写入socket
  • 等待IO线程写入完毕,主线程清空队列,解绑关系,等待后续的连接请求

redis多线程安全么?