01_Redis单线程与多线程

这篇具有很好参考价值的文章主要介绍了01_Redis单线程与多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01——Redis单线程与多线程

一、Redis是单线程还是多线程

在谈Redis的单线程或多线程时,需要根据版本来区分。

  1. 在redis 3.x之前,redis是单线程的
  2. 从redis 4.x开始,redis引入多线程。处理客户端请求时,使用单线程;在异步删除等操作时,使用多线程
  3. 在2020年发布的6.x以及2022年发布的7.x版本,使用全新的多线程来解决问题。

Redis重要里程碑:

  1. Redis 2.6 支持lua脚本
  2. Redis 3.0 支持集群
  3. Redis 4.0 混合持久化、多线程异步删除
  4. Redis 5.0 核心代码重构
  5. Redis 6.0 多线程IO

01_Redis单线程与多线程,redis,redis,缓存

二、Redis为什么选择单线程

Redis单线程

定义:主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时(包括获取(Socket读)、解析、执行、内容返回(Socket写)),都是由一个顺序串的主线程处理,这就是所谓的“单线程”。这也是Redis对外提供键值存储服务的主要流程。

01_Redis单线程与多线程,redis,redis,缓存

但是Redis的其他功能,比如持久化RBD、AOF、异步删除、集群数据同步等,其实是由额外的线程执行的。

Redis命令工作线程是单线程的,但是,对整个Redis来说,是多线程的。

Redis在3.x版本时,性能依旧很快的主要原因:

  1. 基于内存操作: Redis的所有数据都存在内存中,因此所有的运算都是内存级别的
  2. 数据结构简单: Redis的数据结构是专门设计的,而这些简单的数据结构的查找和操作时间复杂度都是O(1)
  3. 多路复用和非阻塞IO: Redis使用IO多路复用功能来监听多个socket连接客户端,这样就可以使用一个线程连接来处理多个请求,减少线程切换带来的开销,同时也避免了IO阻塞操作
  4. 避免上下文切换: 因为是单线程模型,因此就避免了不必要的线程上下文切换和多线程竞争,省去了多线程切换带来的时间和性能上的消耗

在多CPU时代,Redis如何使用多个CPU?

官网:Redis是基于内存操作的,因此Redis的瓶颈可能是机器的内存或网络带宽而非CPU。既然CPU不是瓶颈,那么自然采用单线程。但是在Redis4.0中开始支持多线程了,例如:后台删除、备份等功能。

三、为什么Redis加入了多线程特性

单线程的痛点: 正常情况下,使用del删除数据很快,但是删除一个非常大的key,则会导致Redis主线程卡顿。

解决方案:使用惰性删除,把删除数据的工作交给后台的其他线程来完成。

  1. unlink key
  2. flushdb async
  3. flushall async

本质上来说,就是将耗时的操作从主线程剥离,交给BIO子线程来处理,减少主线程阻塞时间,从而减少因为耗时操作导致的性能和稳定性问题。

四、Redis多线程特性和IO多路复用

Redis性能影响因素:

  1. CPU,官网文档说明,CPU不大可能是Redis的性能瓶颈
  2. 内存,在当下的开发环境中,内存越来越便宜,因此内存也不性能瓶颈
  3. 网络IO:因为Redis从网络IO处理到实际的读写命令处理,都是由单个线程完成的,所以网络IO可能会成为Redis的性能瓶颈。

单个线程处理网络请求的速度,有可能跟不上底层网络硬件的速度。为了应对这个问题,Redis6、7采用多个IO线程来处理网络请求,提高网络请求处理的并行度。

Redis只是使用多线程来处理网络IO操作,此操作可以提升实例的整体处理性能。执行命令操作还是单线程,这就不用开发多线程的互斥枷锁机制。因此,Redis线程模型的实现就很简单。

主线程和IO线程是怎么协作完成请求处理的:

  1. 阶段一:服务端和客户端建立Socket连接,并分配处理线程

    首先,主线程负责接收建立连接的请求。当有客户端请求和实例建立Socket连接时,主线程会创建和客户端的连接,并把Socket放入全局等待队列中。紧接着,主线程通过轮训方法把Socket连接分配给IO线程。

  2. 阶段二:IO线程读取并解析请求

    主线程一旦把Socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求(读取和解析)。因为有多个IO线程在并行处理,所以,这个过程很快就可以完成。

  3. 阶段三:主线程执行请求操作

    等到IO线程解析完请求,主线程还是会以单线程的方式执行这些命令操作。

  4. IO线程回写Socket和主线程清空全局队列

    当主线程执行完请求操作后,会把需要返回的结果写入缓冲区。然后,主线程阻塞等待,IO线程把结果写回到Socket中,并返回给客户端。和IO线程读取解析一样,IO线程回写Socket时,也是多个线程并发执行,所以速度很快。等到IO线程回写Socket完毕,主线程会清空全局队列,等待客户端的后续请求。

01_Redis单线程与多线程,redis,redis,缓存

01_Redis单线程与多线程,redis,redis,缓存

Unix网络编程中的五种IO模型:

  1. Blocking IO:阻塞IO

  2. NoneBlocking IO:非阻塞IO

  3. IO multiplexing:IO多路复用

    1. Linux世界:一切皆文件

      文件描述符,简称FD、句柄

      01_Redis单线程与多线程,redis,redis,缓存

    2. IO多路复用是什么

      一种同步的IO模型,实现一个线程监视多个文件句柄,一旦某个文件句柄就绪,就能通知到对应的应用程序进行相应的读写操作,没有文件句柄就绪时,就会阻塞应用程序,从而释放CPU资源。

      1. IO:网络IO,在操作系统层面,指数据在内核态和用户态之间的读写操作
      2. 多路:多个客户端连接(连接就是套接字描述符,即socket或者channel)
      3. 复用:复用一个或几个线程
      4. IO多路复用:也就是说一个或一组线程处理多个TCP连接,使用单进程就能够实现同时处理多个客户端的连接,无需创建或者维护过多的进程、线程
      5. 实现IO多路复用的模型有三种:select、poll、epoll
    3. epoll

      01_Redis单线程与多线程,redis,redis,缓存

      01_Redis单线程与多线程,redis,redis,缓存

    4. 总结

      01_Redis单线程与多线程,redis,redis,缓存

    5. Redis问什么这么快

      IO多路复用+epoll函数,才是redis为什么这么快的直接原因,而不是单线程命令+redis安装在内存中。

      01_Redis单线程与多线程,redis,redis,缓存

      01_Redis单线程与多线程,redis,redis,缓存

      01_Redis单线程与多线程,redis,redis,缓存

  4. signal driven IO:信号驱动IO

  5. asynchronous IO:异步IO

五、Redis7是否默认开启多线程

如果在实际应用中,发现redis CPU开销不大但吞吐量却没有提升,可以考虑使用redis7的多线程机制,加速网络处理,进而提升实例的吞吐量。

Redis7讲所有的数据放在内存中,内存的响应时长大约是100纳秒,对于小的数据包,Redis服务器可以处理8w到10w的QPS,这也是Redis处理的极限,对于大多数业务来说,单线程Redis已经足够使用了。

在redis6、7中,多线程机制默认是关闭的,如果需要使用redis多线程功能,需要修改redis.conf配置文件:

# 启用多线程
io-thread-do-reads yes
# 设置线程个数。官方建议:4核cpu,线程数设置为2或3;8核cpu,设置为6。线程数一定要小于机器核数,线程数并不是越大越好
io-threads 6

六、总结

01_Redis单线程与多线程,redis,redis,缓存文章来源地址https://www.toymoban.com/news/detail-662969.html

到了这里,关于01_Redis单线程与多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 39 | Redis 6.0的新特性:多线程、客户端缓存与安全

    这个版本中有很多的新特性。所以,6.0 刚刚推出,就受到了业界的广泛关注。所以,在课程的最后, 这节想来聊聊 Redis 6.0 中的几个关键新特性,分别是面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制,以及 RESP 3 协议的使用。 其中,面向网络处理的多 IO 线程可

    2024年04月10日
    浏览(43)
  • Redis(概述、应用场景、线程模式、数据持久化、数据一致、事务、集群、哨兵、key过期策略、缓存穿透、击穿、雪崩)

    目录 Redis概述 应用场景 Redis的线程模式 数据持久化 1.Rdb(Redis DataBase) 2.Aof(Append Only File) mysql与redis保持数据一致 redis事务 主从复制(Redis集群) 哨兵模式 key过期策略 缓存穿透、击穿、雪崩 1.缓存穿透:缓存中没有,在mysql中也没有 2.缓存击穿:数据在数据库中存在,某个

    2024年01月16日
    浏览(64)
  • 【Redis】多级缓存(nginx缓存、redis缓存及tomcat缓存)

    传统的缓存策略一般是请求到达 tomcat 后,先查询redis,如果未命中则查询数据库。这种方式存在以下两个问题: 请求要经过 tomcat 处理, tomcat 的性能成为整个系统的瓶颈。 redis缓存失效时,会对数据库产生冲击。 多级缓存 就是充分利用请求处理的每个环节,分别添加缓存

    2023年04月21日
    浏览(46)
  • 【Redis】封装Redis缓存工具解决缓存穿透与缓存击穿问题

    基于StringRedisTemplate封装一个缓存工具,主要有一下几个方法 方法1:将任意Java对象序列化为json并存储在String的指定key中且设置TTL 方法2:将任意Java对象序列化为json并存储在String的指定key中,并可以设置逻辑过期时间,用户处理缓存击穿问题 方法3:根据指定的key进行查询缓

    2024年02月06日
    浏览(54)
  • Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

    单节点Redis存在着: 数据丢失问题:单节点宕机,数据就丢失了。 并发能力和存储能力问题:单节点能够满足的并发量、能够存储的数据量有限。 故障恢复问题:如果Redis宕机,服务不可用,需要一种自动的故障恢复手段。 RDB持久化 RDB(Redis database backup file,Redis数据库备份

    2024年02月16日
    浏览(42)
  • Redis应用(1)缓存(1.2)------Redis三种缓存问题

    三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了。  一、 缓存穿透: 1、定义: 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。所谓穿透,就是直接透过了redis,直接透到数据库。 2、原因

    2024年01月24日
    浏览(46)
  • 【Redis】Redis作为缓存

    【Redis】Redis常见面试题(2) 缓存在计算机系统中有着重要的作用,它可以显著提高系统的性能和响应速度 提升系统性能: 缓存将常用的数据或计算结果存储在高速的存储介质中,如内存,以便快速地响应请求。通过减少对慢速存储介质(如硬盘或数据库)的访问次数,可

    2024年02月09日
    浏览(37)
  • 【Redis-02】Redis的缓存

    缓存( Cache),就是数据交换的 缓冲区 ,俗称的缓存就是 缓冲区内的数据 。 一句话:因为 速度快,好用 。缓存数据存储于代码中,而代码运行在内存中, 内存的读写性能远高于磁盘 ,缓存可以大大降低 用户访问并发量带来的 服务器读写压力。 使用根据id查询的例子来进行说明 1.3

    2024年02月16日
    浏览(39)
  • redis缓存设计-Redis(八)

    上篇文章介绍了redis缓存设计,热点key,bigkey注意事项。 原创 redis缓存设计-Redis(七) https://blog.csdn.net/ke1ying/article/details/131268967 命令使用 hgetall,lrange,smembers,zrange,sinter等并非不能使用,要指定明确的值,遍历的话要使用 hscan、sscan、zscan 代替。 禁止使用keys,flushall,

    2024年02月10日
    浏览(39)
  • 【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

    在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题,那么如何解决这些问题呢? 在构建缓存系统时,Spring Boot和Redis的结合提供了强大的支持,而Guava的 LoadingCache 则为缓存管理带来了便捷的解决方案。下面我将介绍如何通过整合Spring Boot、Redis和Gu

    2024年04月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包