Redis学习笔记| 青训营笔记

80 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

一、Redis的相关知识

my.oschina.net/jiagoushi/b…

1、Redis6.0相关知识

  1. redis6.0引入多线程IO模型以后的QPS变化

读的性能对比:

写的性能对比:

  1. Redis 6.0之前的版本真的是单线程吗?

Redis是基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。他的组成分4部分:

  • 多个socket
  • IO 多路复用
  • 文件事件分派器
  • 事件处理器

正因为文件事件分派器是单线程的,所以Redis才叫做单线程模型。

Redis之前用单线程模型,是因为性能不在CPU,而在内存和网络。如要用到CPU多核,可搭建多个Redis实例来解决。

其实,Redis 4.0开始就有了多线程概念了,比如Redis通过多线程在后台删除对象。

  1. Redis 6.0之前为什么一直不用多线程?

多线程引入了程序执行顺序不确定的问题,且带来了线程切换、加锁等性能问题。

比如Mysql通过各种方式来避免死锁以及脏写,Redis因为单线程模型,所以从根源上杜绝了这种情况的发生。而且Redis作为缓存数据库,每秒的请求数惊人,如果引入多线程模型,加锁以及上下文切换会造成巨大的性能损失,可能最后导致的QPS还没先单线程高

阿东 2022-12-2 03:05:12

Redis通过Reactor模型,性能已经非常好,没必要使用多线程。

【NIO 系列】—— 之 Reactor 模型

且单线程使得redis内部实现复杂度大大降低,Hash的惰性Rehash, lpush等线程不安全的命令,都不必加锁。

  1. Redis 6.0为什么要引入多线程呢?

Redis的性能瓶颈不在CPU,而在内存和网络。

内存不够,可以做数据结构优化。所以网络才是关键,网络IO在执行期间大量占用了CPU,所以如果网络IO时引入多线程,对性能提升很大。

所以总结起来,Redis6.0支持多线程有两个原因:

1)充分利用CPU多核,6.0之前主线程只能利用一个核

2)多线程任务可以分摊Redis同步IO读写负荷。

  1. Redis 6.0是否默认开启了多线程?

没有,默认关闭。但可以在conf文件中配置。

官方建议:4核的机器建议设置为2或3个线程,8核的建议设为6个线程,线程数一定要小于机器核数,尽量不要超过8个。

  1. Redis 6.0多线程的实现机制

流程简述为:

1)主线程负责接收并建立连接请求,获取socket放入全局等待读处理队列

2)主线程处理完读事件后,通过Round Robin将这些连接分配给这些IO线程

3)主线程阻塞等待IO读取socket完毕

4)主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行。

5)主线程阻塞等待IO线程将数据回写socket完毕

6)解除绑定,清空等待队列

也就是说,真正执行redis命令时,还是单线程的,如步骤4.

多线程,发生在网络IO,步骤三和步骤五

见上图的红字。

  1. 开启多线程后,是否会存在线程并发安全问题?

不会:

1)Redis多线程部分仅用于处理网络IO和协议解析

2)Redis执行命令仍然是单线程的