通过抓包分析 redis 通信协议, 我也能实现一个 redis 客户端

概述

redis 客户端与服务端通信的本质就是基于 socket 的网络编程, 通过字节流来传输数据, 在将数据转成字节流之前, 客户端需要将待传输的数据按照具体的通信协议格式组装一下, 本文主要来分析的是 redis 客户端是通过什么样的数据格式从服务端 读写数据 的.

插入一条数据

如果往 redis 中插入一条 key=username, value=zhangsan的数据, 命令如下:

SET USERNAME ZHANGSAN

实际的通信数据(转为字节之前), 如下所示:

// 原始字符串
*3\r\n$3\r\nSET\r\n$8 \r\nUSERNAME\r\n$8\r\nZHANGSAN

// 为了方便, 格式化如下  
*3
$3
SET
$8
USERNAME
$8
ZHANGSAN

协议格式说明

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEluyTvB-1609680699377)(/Users/zhanggaopei/Library/Application Support/typora-user-images/image-20210103171015171.png)]

  • 为了形象表示, redis 客户端传输的数据格式由 N 多个 组成, 每个 由星号(*) 或者 美元符号($)开头, 回车换行符(\r\n)结尾, 中间是不同含义的数据.

  • 以星号开头的段称为 头段, 以美元符号开头的段成为 数据段.

  • 不管是 redis 操作指令(比如 set、 get 等), 还是指令后面跟的操作数, 统称为 参数, 比如set username zhangsan这条命令中就包含了 3 个参数.

  • 头段中的数据位表示传输的 参数个数, 数据段中的数据位表示为 参数的长度 或者 具体的参数值.

示例如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OBRWPADT-1609680699378)(/Users/zhanggaopei/Library/Application Support/typora-user-images/image-20210103172714818.png)]

用 Java 实现 redis 客户端

以下是测试代码:

public class App 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值