redis执行get等命令时底层操作

这个底层操作主要要分reids 6和之后的。

redis 6之后:

客户端(Java 应用‑Jedis)

  1. 业务代码调用 jedis.set() Java 方法
  2. Jedis 内部把这个方法调用封装成 RESP 协议字节数组
  3. 通过底层TCP Socket ,将字节写入操作系统内核的发送缓冲区
  4. 操作系统内核把数据包通过网络发给 Redis 服务器
  5. Jedis 当前线程进入阻塞,等待 Socket 读取服务端返回数据

Redis 服务端机器(操作系统内核)

  1. 数据包到达 Redis 服务器,存入操作系统 Socket接收缓冲区
  2. Redis 主线程通过 epoll 多路复用,检测到此 socket 有新数据就绪
  3. 主线程自己不去 read 读取数据,把该连接交给其中一个 IO 线程

Redis 服务端‑IO 线程(搬运工,只做网络、协议)

  1. IO 线程调用 read 系统调用,从内核缓冲区读出原始字节流
  2. IO 线程拆解 RESP 协议,把字节还原成 SET 命令、key、value
  3. 将解析完毕的命令提交给 Redis 主线程,IO 线程继续处理其他客户端 socket

Redis 服务端‑主线程(单线程,真正执行业务)

  1. 主线程拿到解析好的 SET 命令,单线程串行执行,修改 Redis 内存哈希表
  2. 生成执行成功的响应,封装成 RESP 协议字节,交给 IO 线程

Redis 服务端‑IO 线程

  1. IO 线程调用 write 系统调用,把 RESP 响应字节写入 Socket 内核发送缓冲区
  2. 操作系统网络回传给 Java 应用服务器

回到 Java‑Jedis 客户端

  1. Java 机器内核 Socket 收到响应字节
  2. 原本阻塞的 Jedis 线程读到字节流
  3. Jedis解析 RESP 协议,把字节转为 Java 结果(OK 字符串)
  4. 将结果返回给我们的业务代码,方法调用结束,阻塞解除

redis 6之前:

没有上述IO线程读取数据拆解RESP协议这些操作由主线程进行执行这些操作,由于主线程以后读不过来为了提高速度,引入了IO线程。

相关推荐
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw5 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号6 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠6 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放7 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261358 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长8 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节