Redis为什么选择单线程?Redis为什么这么快?

 更新时间:2023年03月21日 08:22:16   作者:哪吒编程  
这篇文章主要介绍了Redis为什么选择单线程?Redis为什么这么快?的相关资料,需要的朋友可以参考下

今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

一、Redis版本迭代

Redis为什么选择单线程?Redis为什么这么快?_主线程

Redis2.6,支持lua脚本;

Redis3.0,支持集群;

Redis4.0,混合持久化,多线程异步删除;

Redis5.0,核心代码重构;

Redis6.0,多线程IO;

Redis7.0,Function、Multi-part-AOF;

二、Redis4.0之前为什么一直采用单线程?

1、Redis采用单线程模型方便开发和维护;

2、单线程模型也可以通过IO多路复用和非阻塞IO并发处理多客户端请求;

3、对于Redis来说,主要的性能瓶颈是内存和网络,而不是CPU;

三、Redis6.0引入多线程

Redis6.0之前,Redis从网络IO处理到实际的读写命令处理,都是单线程的,只不过在数据删除、数据持久化的时候使用的是多线程。

Redis的性能瓶颈主要是网络IO,因此,Redis6.0开始,采用多个IO线程来处理网络请求,提高网络请求处理的并行度。

四、Redis主线程和IO线程是如何完成请求的?

Redis为什么选择单线程?Redis为什么这么快?_多线程_02

1、服务端和客户端建立socket连接

主线程负责建立连接,并把socket放入全局等待队列,主线程通过轮询的方法将socket连接分配给IO线程。

2、IO线程读取并解析请求

主线程一旦把socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求,此时,采用多个IO线程并行处理。

3、主线程执行请求命令

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

4、IO线程会写回socket和主线程清空全局队列

当主线程执行完请求命令后,会将结果写入缓冲区,主线程进入阻塞状态,等待IO线程将结果回写到socket中,并返回给客户端。

回写socket完毕后,主线程清空全局队列。

五、IO多路复用是什么?

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

1、IO,操作系统层面指数据在内核态和用户态之间进行的读写操作;

2、多路,多个客户端socket连接;

3、复用,复用线程;

4、IO多路复用,使用单线程就能够同时处理多个客户端socket连接;

客户端socket对应的文件描述符FileDescriptor注册进epoll,epoll会监听哪些socket有消息,避免大量的无用操作。

此时socket采用非阻塞模式,整个过程只在调用select、poll、epoll时才会阻塞,收到客户端消息不会阻塞,这个进程就会被充分利用起来,这种模式一般被称为事件驱动,也就是reactor反应模式。

采用epoll的方式,最终目的是提高服务器的吞吐能力。

IO多路复用与epoll函数才是**“Redis为什么这么快?”**的直接原因。

六、总结

Redis是一个基于内存操作、KV形式的数据库,采取多路复用、非阻塞IO、避免了不必要的上下文切换等特性。

Redis一直存在BigKey问题,因此在Redis4.0引入了多线程异步删除,正式打开Redis多线程新篇章。

Redis6.0引入IO多线程的读写,更高效的处理请求,Redis只是将IO读写变成了多线程,命令的执行还是由主线程单线程执行,因此,多线程下操作Redis不会出现线程安全的问题,不用像Java那样加锁,解锁,这也是Redis为什么这么快的根本原因。

到此这篇关于Redis为什么选择单线程?Redis为什么这么快?的文章就介绍到这了,更多相关Redis线程与Redis快的原因内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis 用scan指令 代替keys指令(详解)

    redis 用scan指令 代替keys指令(详解)

    下面小编就为大家分享一篇redis 用scan指令 代替keys指令详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Redis中管道操作pipeline的实现

    Redis中管道操作pipeline的实现

    RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操作pipeline的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Redis过期监听机制,订单超时自动取消方式

    Redis过期监听机制,订单超时自动取消方式

    这篇文章主要介绍了Redis过期监听机制,订单超时自动取消方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringSession通过Redis统计在线用户数量的实现代码

    SpringSession通过Redis统计在线用户数量的实现代码

    这篇文章主要介绍了SpringSession通过Redis统计在线用户数量,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Redis 使用跳表实现有序集合的方法

    Redis 使用跳表实现有序集合的方法

    Redis有序集合底层为什么使用跳表而非其他数据结构如平衡树、红黑树或B+树的原因在于其特殊的设计和应用场景,跳表提供了与平衡树类似的效率,同时实现更简单,调试和修改也更加容易,感兴趣的朋友一起看看吧
    2024-09-09
  • 为Java项目添加Redis缓存的方法

    为Java项目添加Redis缓存的方法

    Redis一般有Linux和Windows两种安装方式,本文就这两种方式给大家详细介绍,对java项目添加redis缓存相关知识,感兴趣的朋友一起看看吧
    2021-05-05
  • 基于 Spring Aop 环绕通知实现 Redis 缓存双删功能(示例代码)

    基于 Spring Aop 环绕通知实现 Redis 缓存双删功能(示例代码)

    基于 spring aop 常规应用场景多是用于日志记录以及实现 redis 分布式锁,在 github 中也有项目是把它拿来当作缓存的异常捕捉,这篇文章主要介绍了基于 Spring Aop 环绕通知实现 Redis 缓存双删,需要的朋友可以参考下
    2022-08-08
  • Redis生成全局唯一ID的实现方法

    Redis生成全局唯一ID的实现方法

    全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具,本文主要介绍了Redis生成全局唯一ID的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2022-06-06
  • Redis安装配置与常用命令

    Redis安装配置与常用命令

    Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统。由于 Redis 的键包括 string,hash,list,set,sorted set,bitmap 和 hyperloglog,所以常常被称为数据结构服务器。
    2018-03-03
  • Redis的常用命令小结

    Redis的常用命令小结

    本文主要介绍了Redis的常用命令小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论