服务器客户端通信协议,Redis服务端-客户端通信协议
了解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服务端-客户端通信协议相关推荐
- Redis(服务端/客户端)的启动、关闭、查看状态
目录 服务端 查看Redis是否启动 前台启动 后台启动 关闭(停止) 客户端 启动(单机模式) 启动(集群模式) 退出 客户端使用示例 服务端 查看Redis是否启动:ps -ef|grep red ...
- php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解
Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...
- mc正版mite服务器,MITE-R192服务端客户端 配套独立可管理登陆系统
MITE由于其特殊性不可安装任何MOD插件,所以除了开通正版验证一直很少有其他ID登陆方案.这里放出包含了由@yushijinhun提供的authlib-agent 开源的游戏外登录解决方案的MITE ...
- 我的世界服务器java出错_看懂 游戏《Minecraft》的崩溃报告 服务端/客户端
前言 [WARNING] 本篇适用于Minecraft服务端/客户端报错的诊断分析,其他游戏除外,比如网易 [WARNING] 本篇适用于Minecraft服务端/客户端报错的诊断分析,其他游戏除外, ...
- 魔力宝贝服务器修改器装备,【法兰城的回忆】魔力宝贝游戏手工架设服务端+客户端修改工具+流程说明...
[法兰城的回忆]魔力宝贝游戏手工架设服务端+客户端修改工具+流程说明_站长网(Downzz.com) 安装说明: 1.安装宝塔 yum install -y wget && wget ...
- 侠义道服务器修改,[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改...
[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改 资源说明: 1.本资源为侠义道Online1.85版本,默认IP为192.168.200.175,虚拟机架设,默认使用NAT模 ...
- 网络云盘项目——HTTP接口介绍、功能介绍、服务端/客户端代码解析
一.本文目的 本项目分为6篇博客文章完成: 1.项目总体介绍:https://blog.csdn.net/qq_41453285/article/details/107871393. 2.Redis部 ...
- 易语言tcp多线程服务端客户端_从TCP协议到TCP通信的各种异常现象和分析
很多人总觉得学习TCP/IP协议没什么用,觉得日常编程开发只需要知道socket接口怎么用就可以了.如果大家定位过线上问题就会知道,实际上并非如此.如果应用在局域网内,且设备一切正常的情况下可能确实如 ...
- http 缓存分为客户端缓存和服务端缓存
http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...
最新文章
- 简解Css - 多变的边框
- linux c不占用cpu的延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
- git 如何忽略掉文件夹_#PY小贴士# 我的git仓库为什么每次提交都有很多改动?
- Xshell调节字体大小和样式
- 微课|中学生可以这样学Python(例7.3):栈
- python gui下载进度条_对python GUI实现完美进度条的示例详解
- ArrayList源码解析
- Palm应用开发之三appinfo.json 文件详解
- 基于C51实现测试人体反应速度
- 前端根据后端数据生成表格 行列合并 指定表头
- Excel VBA高级编程-微信群发消息工具
- 用html5做一个视频网页,如何使用HTML5在网页上制作交互式视频?
- 2023最新苹果CMS10魔加主题1.1.6去授权版+支持全部版本
- day07-python字典
- android animator
- Kafka消费者不消费数据
- 运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法
- 面试-Senior Specialist for Devops-车企
- java数据结构课程设计_java数据结构课程设计
- Cesium 地球旋转动画效果
热门文章
- 拼多多否认对极兔快递“政策倾斜”;86版西游记“红孩儿”成中科院博士;AirTag遭破解 | 极客头条...
- 实用工具类APP,海外大有可为
- 读懂 x86 架构 CPU 虚拟化,看这文就够了 | 赠书
- Go,11 岁生日快乐!
- 听音乐不过瘾?自制一个音乐播放器!| 原力计划
- 红警 1 游戏开源,代码非常规范,网友:秀色可餐
- 让 AI 训练 AI:揭秘阿里、浙大的 AI 训练师助手
- 程序员是如何做到随时随地编程的?
- 光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选
- 红旗Linux的“亚洲区块链操作系统”重装上阵!