[诚心求问]小白想问一个有关 nc 连接 redis-server 的问题

2019-08-14 11:31:48 +08:00
 zazalu
在学习 redis 的过程中,我了解到了可以使用 nc 命令来连接 redis-server, 直接打开一个 TCP 连接来交互数据,获取 redis 的返回

但是我又从相关书籍上了解到, redis 的数据交互需要遵照 RESP 协议,

意思就是说我们发送`set hello world` , 这是不符合 RESP 协议的格式的, redis 没法理解的(?), 需要改为

```
*3
$3
set
$5
hello
$5
world

```

如果从这个角度出发, 为什么 nc 工具发送的数据, redis 可以处理并返回呢? 比如如下案例

```
//连接
nc 127.0.0.1 6379

//发送一条 redis 指令(没有符合 RESP 协议规定的格式)
set hello world

//redis 返回
+OK

```

由于我知识匮乏, 尝试多次 google, 比如

1. 为什么 nc 连接 redis, 发送的数据不符合 RESp, redis 却可以理解并返回
2. nc 发起的 TCP 连接,默认使用的是什么应用层协议.
...

这些关键字的查询结果都不是我想要的 T T

所以我想希望 v2 的前辈们, 可以帮助我, 这个地方有个我知识的断层区, 心里很难受.
12987 次点击
所在节点    Redis
7 条回复
zazalu
2019-08-14 11:43:00 +08:00
诚心求问, 已经自己查了很多资料了, 但是都没有点到我问的这个点上. 计算机网络 TCP 那块我也翻了... 真心希望有前辈可以指点下
momocraft
2019-08-14 11:46:54 +08:00
那就是 tcp 连接(字节流)没有应用层协议

我看到有人 telnet redis 写文本命令也成功的,也许 redis 就是理解
jybox
2019-08-14 11:49:45 +08:00
40huo
2019-08-14 12:41:24 +08:00
Redis also accepts commands in a special way that is designed for humans, and is called the inline command format.

也支持 line based
julyclyde
2019-08-14 12:43:43 +08:00
本来就理解
你说的那个格式是应答格式
zazalu
2019-08-14 12:45:59 +08:00
@jybox 好像并没有写 nc 的情况啊..

`Clients send commands to the Redis server using RESP Arrays`

这个 RESP Arrays 就是我说的格式, 但是 nc 发送数据 没有按照这个格式也能回复正确

总之谢谢回复..

我发现我按照 RESP 格式发送数据, redis 反而懵逼了, 算了, 这些内部机制不是自己写的不去揣测了..
zazalu
2019-08-14 12:47:30 +08:00
@40huo
谢谢! 我懂了
@jybox
不好意思. 是我没仔细看, 对不起

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/591766

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX