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线程。

相关推荐
叶总没有会1 小时前
微服务--分布式基础
java·spring·spring cloud·微服务
鹿角片ljp1 小时前
Prompt Cache、Token 成本与 Plan Compiler 的工程设计
java·python·算法
Wang's Blog2 小时前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog2 小时前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨6 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空9 小时前
金蝶苍穹build.gradle配置
java·build.gradle
步行cgn12 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵12 小时前
Apache Ant 1.9.9 完整讲解
java
LuTshoes13 小时前
spring ai 实战 手搓 PlaneExecuteAgent
java·人工智能·spring·ai