Redis21:客户端与服务器端的通信与redis管道

客户端与服务器端的通信与redis管道

服务器的任务调度

IO模型采用的是多路复用IO。

redis会为每个客户端套接字都分配一个指令队列,redis会从指令队列中取出指令执行,还会为每个客户端套接字分配一个相应队列,将指令的结果返回给客户端。

redis处理定时任务时会将定时任务放入一个堆中,堆顶就是最快要执行的任务,轮询时redis都会取出已经到时间的任务来处理,还会将要执行的任务需要的时间记录下来,redis会直接睡眠这些时间。

通信协议:RESP(Redis Serialization Protocol)

将协议传输的数据分为5种类型:

单行字符串(+开头)、多行字符串($字符串长度开头)、整数值(:开头)、错误信息(-错误类型 开头)、数组(*数组长度 开头)

每种类型都以 结尾,如果是多行字符串开始要加 ,每次换行都要加 ,如果是数组那么开始要加 ,每个元素之间也要用 隔开。

客户端和服务器之间的所有指令和返回值都以这几种形式传递,可能会有比较复杂的返回内容,如嵌套数组,scan指令的结果。

redis的协议中有大量冗余的回车换行符,但是简单易理解。

通信过程

客户端将要发送的指令写入操作系统内核为套接字分配的发送区缓冲send buffer,然后通过网卡发送到服务器的网卡,服务器操作系统内核将网卡的数据放入为套接字分配的接受缓冲区recv buffer,然后服务器进程从缓冲区读取进行处理。其中读write操作负责将数据写入发送缓冲区中,然后操作系统负责异步的发送到目标机器,如果缓冲区满了,write才会阻塞等待。而read操作是把数据从接收缓冲区中取出来,如果缓冲是空的它需要等待数据的到来。

在一次交互中,一般write是不耗时的,发送缓冲区不会满,但是read需要等待消息的送到,这个等待时间就是一次网络开销。

Pipeline(redis管道)

管道pipeline就是一次性调整多个命令的顺序,让写的和读的放在一起处理,这样一次性写入多个操作进入缓冲区基本不耗时,而多个读操作只需要等待一个网络来回开销即可,提升了效率。

原文地址:https://www.cnblogs.com/yinyunmoyi/p/11526283.html