首页 > 数据库 >Redis 6.0 为什么要引入多线程呢?

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

时间:2022-12-26 15:04:21浏览次数:67  
标签:Redis 网络 线程 内存 IO 6.0 多线程

Reactor 模式

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

  • 多套接字
  • IO 多路复用程序
  • 文件事件派发器
  • 事件处理器。

Redis 6.0 为什么要引入多线程呢?_Redis在这里插入图片描述

一般来说 Redis 的瓶颈并不在 CPU,而在内存和网络。如果要使用 CPU 多核,可以搭建多个 Redis 实例来解决。

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

Redis 的瓶颈并不在 CPU,而在内存和网络

  • 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核。
  • 多线程任务可以分摊 Redis 同步 IO 读写负荷。

内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

Redis 6.0 多线程的优化方向如下:

  • 提高网络 IO 性能,典型的实现比如使用 DPDK 来替代内核网络栈的方式。
  • 使用多线程充分利用多核,典型的实现比如 Memcached

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

否,在conf文件进行配置

io-threads-do-reads yes
io-threads 线程数

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

Redis 6.0 多线程实现机制

Redis 6.0 为什么要引入多线程呢?_多路复用_02流程简述如下:

  1. 主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
  2. 主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程
  3. 主线程阻塞等待 IO 线程读取 socket 完毕
  4. 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行
  5. 主线程阻塞等待 IO 线程将数据回写 socket 完毕
  6. 解除绑定,清空等待队列Redis 6.0 为什么要引入多线程呢?_多路复用_03

该设计有如下特点:

  • IO 线程要么同时在读 Socket,要么同时在写,不会同时读或写。
  • IO 线程只负责读写 Socket 解析命令,不负责命令处理。

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

不会,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。

Redis 线程中经常提到 IO 多路复用,如何理解?

这是 IO 模型的一种,即经典的 Reactor 设计模式,有时也称为异步阻塞 IO。

Redis 6.0 为什么要引入多线程呢?_多线程_04多路指的是多个 Socket 连接,复用指的是复用一个线程。多路复用主要有三种技术:Select,Poll,Epoll。

Epoll 是最新的也是目前最好的多路复用技术。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了 Redis 具有很高的吞吐量。

Redis6.0与Memcached多线程模型对比:

相同点:都采用了 master线程-worker 线程的模型 不同点:Memcached 执行主逻辑也是在 worker 线程里,模型更加简单,实现了真正的线程隔离,符合我们对线程隔离的常规理解。而 Redis 把处理逻辑交还给 master 线程,虽然一定程度上增加了模型复杂度,但也解决了线程并发安全等问题。

参考资料
欢迎关注公众号:程序员开发者社区

Redis 6.0 为什么要引入多线程呢?_多线程_05






标签:Redis,网络,线程,内存,IO,6.0,多线程
From: https://blog.51cto.com/u_15683090/5968969

相关文章

  • CentOS 6.0 图形(图解)安装教程、基本配置、网络配置、软件源配置、安装压
    一.准备安装CentOS61.CentOS简介CentOS是甚么?CentOS是一个基于RedHat企业级Linux提供的可自由使用的源代码企业级的Linux发行版本。每个版本的CentOS都会获得七年......
  • 在java中操作redis
    Redis的客户端很多,官方推荐三种:(Jedis,lettuce,Redission)。springdataredis,在SpringBoot项目中还提供了对应的Starter,即Spring-boot-starter-data-redis.Jedis的maven......
  • Redis数据类型
    Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型字符串string普通字符串(常用)哈希hash适合存储对象列表list按照插入顺序排序,可......
  • 【基础篇】一文带你掌握 Redis
    一、摘要谈起Redis,相信大家都不会陌生,做过云平台开发的程序员多多少少会接触到它,Redis英文全称:RemoteDictionaryServer,也被称之为远程字典服务。从官方的定义看,Redis......
  • 如何理解redis两种不同的持久化方式
    其实redis就是一种高级的以键值对形式存储数据的数据库,而它的好处就是他可以支持数据的持久化,其实redis之所以会有这样的优点,主要是因为,redis的数据都是存放在内存中的,如果......
  • springboot 连接不上 redis 的三种解决方案!
    针对于这种情况,首先,我们最简单直接的方法就是需要确认Redis是否已经正常启动(验证方法:如果安装在Linux下的话可以使用ps-ef|grepredis来进行确认是否开启) 如果未开启,我......
  • 使用 Redis 以反应方式访问数据
    本指南将引导您完成创建功能响应式应用程序的过程,该应用程序使用Spring数据通过非阻塞生菜驱动程序与Redis进行交互。您将构建什么您将构建一个使用春季数据红和项目反......
  • 多线程
    多线程什么是进程?什么是线程?进程是一个应用程序(1个进程是一个软件)。线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程。对于java程序来说,当在DOS命令......
  • springboot 使用redis和lettuce原理
    springboot使用redis  简介   在SpringBoot中,要访问Redis,可以直接引入spring-boot-starter-data-redis依赖,它实际上是SpringData的一个子项目——SpringDat......
  • redis设计与实现(一) redis概念和数据结构
    基础概念     定义       Redis(RemoteDictionaryServer)是一个使用C语言编写的,高性能非关系型的键值对数据库。     特点 基于......