前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis内存模型

Redis内存模型

原创
作者头像
CodingCode
修改2021-05-31 10:37:09
8300
修改2021-05-31 10:37:09
举报

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

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

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

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

2、Redis单线程模型组成?

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

redis模型
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请求链路
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文件进行配置开启:

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

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

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

redis多线程
redis多线程

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

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档