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

相关推荐
Sarvartha2 小时前
final 关键字
java·开发语言
2601_952047792 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
数据狐(Datafox)2 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
Escalating_xu4 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦4 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
一个风轻云淡5 小时前
GCC 和 GDB命令简单解读
java·linux·前端
省钱兄--zs5 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析
资料库015 小时前
Linux 8个常见运维故障排查
java·linux·运维