原创

Redis内存模型

1、为什么Redis是单线程的呢?

    这里强调的单线程是指网络请求模块使用一个线程来处理,即一个线程处理所有网络请求,其他模块仍用多个线程。

    那为什么使用单线程呢?官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现且CPU不会成为瓶颈,顺理成章地采用单线程的方案了。

    Redis是基于Reactor模式开发自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是单线程的。

2、Redis单线程模型组成?

  • 多个socket
  • IO多路复用程序
  • socket队列
  • 文件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

redis模型

3、客户端与Redis一次完整通信过程

3.1、建立连接

  1. 首先,redis 服务端进程初始化的时候,会将 server socket 的 AE_READABLE 事件与连接应答处理器关联。
  2. 客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该 socket 压入队列中。
  3. 文件事件分派器从队列中获取 socket,交给连接应答处理器。
  4. 连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。

3.2、执行set操作

  1. 客户端发送了一个 set key value 请求,此时 redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将 socket01 压入队列,
  2. 此时事件分派器从队列中获取到 socket01 产生的 AE_READABLE 事件,由于前面 socket01 的 AE_READABLE 事件已经与命令请求处理器关联,
  3. 因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置。
  4. 操作完成后,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。
  5. 如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,
  6. 事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

redis请求链路

4、Redis6.0 的多线程

4.1、Redis6.0 之前为什么一直不使用多线程?

    Redis使用单线程的可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加解锁、死锁造成的性能损耗

4.2、Redis6.0 为什么要引入多线程呢?

    因为Redis的瓶颈不在内存,而是在网络IO模块带来CPU的耗时,所以Redis6.0的多线程用来处理网络IO这部分,充分带来CPU资源,减少网络IO阻塞带来的性能损耗

4.3、Redis6.0如何开启多线程

    默认是关闭多线程的,可以在conf文件进行配置开启:

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

4.4、多线程模式下,是否存在并发安全问题?

    在redis的多线程模式下,获取、解析命令,以及输出结果两个过程,可以配置成多线程执行,因为它毕竟是定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。所以,Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行,也就不存在并发安全问题。

redis多线程

参考:《石杉的架构笔记》

可以关注以下公众号,掌握一手资料

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis内存模型

    Tanyboye
  • 精讲Redis内存模型

    用户1263954
  • 深入了解Redis内存模型

    Spark学习技巧
  • 深入了解Redis内存模型 原

    在客户端通过redis-cli连接服务器后(后面如无特殊说明,客户端一律使用redis-cli),通过info命令可以查看内存使用情况:

    wuweixiang
  • 深度历险:Redis 内存模型详解

    Redis 是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说 Redis 是实现网站高并发不可或缺的一部分。

    Java技术栈
  • Redis为什么这么快?一文深入了解Redis内存模型!

    Redis 是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说 Redis 是实现网站高并发不可或缺的一部分。

    挨踢小子部落阁
  • 可能是目前最详细的Redis内存模型及应用解读

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

    田维常
  • 深入了解一下Redis的内存模型!

    小小科
  • 深入了解一下Redis的内存模型!

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

    Java后端技术
  • 深入了解一下Redis的内存模型

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

    马哥linux运维
  • 精讲Redis内存模型一、Redis内存统计二、Redis内存划分三、Redis数据存储的细节四、Redis的对象类型与内部编码五、应用举例

    Java架构
  • 分享 | Redis常用操作和内存模型

    这里面 info 是命令 memory 是参数 单单输入 info 就死查看所有的信息,如果只需要查看内存情况,只需要加上内存这个参数

    用户1516716
  • Java内存模型

    Java内存模型(简称JMM)指定了JVM如何利用计算机内存(RAM)进行工作。JMM与整个计算机的模型类似,这个模型自然也包含内存模型,即Java内存模型(A...

    码代码的陈同学
  • JVM内存模型

    java404
  • java内存模型

    java404
  • Java内存模型

    在多核时代,如何提高CPU的性能成为了一个永恒的话题,而这个话题的讨论主要就是如何定义一个高性能的内存模型,内存模型用于定义处理器的各层缓存与共享内存的同步机制...

    用户1263954
  • Go内存模型

    Go语言中内存分配大致有3种模式:Stack、Heap、Fixed Size Segment。

    后台搬砖鹅
  • JVM内存模型

    先磨磨肩擦擦掌,小二很早就听说jvm的内存很是奇特,今日一看果然不同凡响。下面且听小二一一道来。

    shengjk1
  • Java内存模型

    多任务处理在现代计算机操作系统中几乎已经是一项必备的功能了。计算机cpu的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或...

    栋先生

扫码关注云+社区

领取腾讯云代金券