了解Redis通信内容

Redis我们都比较熟悉,可以用来做缓存、分布式锁等,但是,其中的客户端与服务端是如何进行通信的呢?

我们可以分别模拟一个服务端或者客户端,打印查看来自实际连接的请求来获取它们的通信方式

首先,让我们先使用先模拟一个服务端,使用Jedis进行连接查看

1

2

3

4

5

6

7

8

9

10

11

12

13

14// 一个简单的demo

public class MockRedisServer{

public static void main(String[] args) throws IOException{

ServerSocket serverSocket = new ServerSocket(6379);

Socket socket = serverSocket.accept();

try (InputStream inputStream = socket.getInputStream();

final OutputStream outputStream = socket.getOutputStream()) {

byte[] data = new byte[1024];

final int read = inputStream.read(data);

final byte[] bytes = Arrays.copyOf(data, read);

System.out.println(new String(bytes));

}

}

}

这时用Jedis进行连接

1

2

3

4

5

6

7

8

9

10

11

12// 这时客户端会报错,因为我们模拟的非常简单,没有实现真正的功能返回数据

Jedis jedis = new Jedis("127.0.0.1", 6379);

jedis.set("k1", "v1");

// 在服务端将会看到如下输出

*3

$3

SET

$2

k1

$2

v1

具体这些内容是什么意思呢?其实这就是RESP(REdis Serialization Protocol)协议的格式

Redis通信协议-RESP

Redis客户端与服务端通信使用 RESP(REdis Serialization Protocol)协议

它是一个序列化协议,支持如下几种数据类型,具体类型判断通过第一个字节判断,之间通过”\r\n”来分隔

简单字符串 以”+”开头

错误类型 以”-“开头

整数 以”:”开头

块字符串 以”$”开头

数组 以”*”开头

客户端每次发送一个块字符串数组到服务端,服务端根据命令执行后返回结果

简单字符串

以”+”字符开头,后面接实际字符串,最后以”\r\n”结尾

因为字符是通过’\r\n’来判断结尾的,所以此种类型中的字符串内容就不能包含这特殊字符,如果有需要可以使用块字符串类型

例子:+OK\r\n

错误类型

以”-“字符开头,后面接着错误错误信息,最后以”\r\n”结尾

例子:-Error message\r\n

整数

以”:”字符开头,数值,,最后以”\r\n”结尾

例子::1000\r\n

块字符串

以”$”字符开头,后面是字符串的实际长度,之后以”\r\n”分隔,接着是字符串内容,最后以’\r\n’结尾

例子:

1

2

3

4foobar : $6\r\nfoobar\r\n

// 为了方便阅读,可以简化为

$6

foobar

空字符串:$0\r\n\r\n

Null(不存在的值):$-1\r\n

数组

以”*”开头,后面是数组长度,之后以”\r\n”分隔,后面是具体的其他的数据值(数据类型不要求一致)

空数组:*0\r\n

1

2

3

4

5

6

7["1", "foo"]:*2\r\n$1\r\n1\r\n$3\r\nfoo\r\n

方便阅读,简化为:

*2 // 数组长度为2

$1 // 此元素为长度为1的简单字符

1 // 字符内容为"1"

$3 // 此元素为长度为3的简单字符

foo // 字符内容为"foo"

如果是队列阻塞超时,则返回值为:*-1\r\n

现在再让我们看一下之前demo中的返回值就会很明了了,这里简单解释一下

1

2

3

4

5

6

7

8// 原始命令 set k1 v1

*3 -长度为3的数组

$3 -一个长度为3的字符串

SET -字符内容为 "SET"

$2 -一个长度为2的字符串

k1 -字符内容为 "k1"

$2 -一个长度为2的字符串

v1 -字符内容为 "v1"

服务器客户端通信协议,Redis服务端-客户端通信协议相关推荐

  1. Redis(服务端/客户端)的启动、关闭、查看状态

    目录 服务端 查看Redis是否启动 前台启动 后台启动 关闭(停止) 客户端 启动(单机模式) 启动(集群模式) 退出 客户端使用示例 服务端 查看Redis是否启动:ps -ef|grep red ...

  2. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解

    Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...

  3. mc正版mite服务器,MITE-R192服务端客户端 配套独立可管理登陆系统

    MITE由于其特殊性不可安装任何MOD插件,所以除了开通正版验证一直很少有其他ID登陆方案.这里放出包含了由@yushijinhun提供的authlib-agent 开源的游戏外登录解决方案的MITE ...

  4. 我的世界服务器java出错_看懂 游戏《Minecraft》的崩溃报告 服务端/客户端

    前言 [WARNING] 本篇适用于Minecraft服务端/客户端报错的诊断分析,其他游戏除外,比如网易 [WARNING] 本篇适用于Minecraft服务端/客户端报错的诊断分析,其他游戏除外, ...

  5. 魔力宝贝服务器修改器装备,【法兰城的回忆】魔力宝贝游戏手工架设服务端+客户端修改工具+流程说明...

    [法兰城的回忆]魔力宝贝游戏手工架设服务端+客户端修改工具+流程说明_站长网(Downzz.com) 安装说明: 1.安装宝塔 yum install -y wget && wget ...

  6. 侠义道服务器修改,[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改...

    [侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改 资源说明: 1.本资源为侠义道Online1.85版本,默认IP为192.168.200.175,虚拟机架设,默认使用NAT模 ...

  7. 网络云盘项目——HTTP接口介绍、功能介绍、服务端/客户端代码解析

    一.本文目的 本项目分为6篇博客文章完成: 1.项目总体介绍:https://blog.csdn.net/qq_41453285/article/details/107871393. 2.Redis部 ...

  8. 易语言tcp多线程服务端客户端_从TCP协议到TCP通信的各种异常现象和分析

    很多人总觉得学习TCP/IP协议没什么用,觉得日常编程开发只需要知道socket接口怎么用就可以了.如果大家定位过线上问题就会知道,实际上并非如此.如果应用在局域网内,且设备一切正常的情况下可能确实如 ...

  9. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

最新文章

  1. 简解Css - 多变的边框
  2. linux c不占用cpu的延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  3. git 如何忽略掉文件夹_#PY小贴士# 我的git仓库为什么每次提交都有很多改动?
  4. Xshell调节字体大小和样式
  5. 微课|中学生可以这样学Python(例7.3):栈
  6. python gui下载进度条_对python GUI实现完美进度条的示例详解
  7. ArrayList源码解析
  8. Palm应用开发之三appinfo.json 文件详解
  9. 基于C51实现测试人体反应速度
  10. 前端根据后端数据生成表格 行列合并 指定表头
  11. Excel VBA高级编程-微信群发消息工具
  12. 用html5做一个视频网页,如何使用HTML5在网页上制作交互式视频?
  13. 2023最新苹果CMS10魔加主题1.1.6去授权版+支持全部版本
  14. day07-python字典
  15. android animator
  16. Kafka消费者不消费数据
  17. 运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法
  18. 面试-Senior Specialist for Devops-车企
  19. java数据结构课程设计_java数据结构课程设计
  20. Cesium 地球旋转动画效果

热门文章

  1. 拼多多否认对极兔快递“政策倾斜”;86版西游记“红孩儿”成中科院博士;AirTag遭破解 | 极客头条...
  2. 实用工具类APP,海外大有可为
  3. 读懂 x86 架构 CPU 虚拟化,看这文就够了 | 赠书
  4. Go,11 岁生日快乐!
  5. 听音乐不过瘾?自制一个音乐播放器!| 原力计划
  6. 红警 1 游戏开源,代码非常规范,网友:秀色可餐
  7. 让 AI 训练 AI:揭秘阿里、浙大的 AI 训练师助手
  8. 程序员是如何做到随时随地编程的?
  9. 光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选
  10. 红旗Linux的“亚洲区块链操作系统”重装上阵!