程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了什么是RESP?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

RESP (redis serialization Protocal)

redis客户端和服务端之间通信的协议。它很简单,建立在TCP协议上,提供简单、高性能、可读性强的数据序列化的规范和语义。

什么是RESP?

5种数据模型

Simple Strings@H_696_22@

Simple Strings用于服务端对一些客户端命令的响应

格式:"+"开头 "rn"结尾,中间内容不能含有'r'或'n'

# set命令得到响应
127.0.0.1:6379> set name Foo
OK
# 服务端返回完整内容:"+OKrn“

# 退出命令
127.0.0.1:6379> quit

# 服务端返回的完整内容:+OKrn

Simple Strings的结构是非常简单的,而且不是二进制安全的;所以只会在服务端的简单内容返回。只是GET、@H_926_26@mGET等命令的内容返回会用Buik Strings。

Errors@H_696_22@

Errors 用于服务端对客户端一些错误命令的返回内容

格式:"-"开头 "rn"结尾

# 执行不存在的命令
127.0.0.1:6379> gee name
(error) ERR unknown command 'gee'
# 服务端返回完整内容:"-ERR unknown command 'gee'rn"

# 错误的类型操作
127.0.0.1:6379> set name Bob
OK
127.0.0.1:6379> zadd name 1 Foo
(error) WRONGTYPE Operation against a key holding the wrong kind of value
# 服务端返回完成内容:"-WRONGTYPE Operation against a key holding the wrong kind of valuern"

从例子中可以看出Erorrs响应中间部分的内容由两部分构成:大写代表错误类型,消息的表示错误详情。即-Error messagern

Integers@H_696_22@

用于需要返回整数内容的命令,比如:INCRLLEN

格式:":"开头,rn结尾,中间部分必须是有效的整数

# incr
127.0.0.1:6379> set count 1
OK
127.0.0.1:6379> incr count
(Integer) 2
# 服务端返回完整内容:":2rn"

# lpush llen del
127.0.0.1:6379> lpush userList Bob
(Integer) 1
127.0.0.1:6379> llen userList
(Integer) 1
# 服务端返回完整内容:":1rn",代表列表中当前元素书,数量

# del
127.0.0.1:6379> del userList
(Integer) 1
# 服务端返回完整内容:":1rn", 含义是执行成功

# exists
127.0.0.1:6379> set name Bob
OK
127.0.0.1:6379> exists name2
(Integer) 0
# 服务端返回完整内容:":0rn",含义是不存在
127.0.0.1:6379> exists name
(Integer) 1
# 服务端返回完整内容:":1rn",含义是存在

这些命令的响应内容都是使用Integers:SETNX, DEL, EXISTS, INCR, INCRBY, DECR, DECRBY, DBSIZE, LASTSAVE, RenameNX, MOVE, LLEN, SADD, SREM, SISMEMBER, SCARD

Bulk Strings@H_696_22@

用来传输二进制安全的字符内容,最大长度是512MB

格式:'$'开头,后跟整数代表真正字符长度,然后rn,后面接真正的字符串内容,最后rn结尾例:"$6rnfoobarrn"

正常返回

127.0.0.1:6379> set name foo
OK
127.0.0.1:6379> get name
"foo"
# 服务端返回完整内容:"$3rnfoorn"

空字符串返回

127.0.0.1:6379> set name ""
OK
127.0.0.1:6379> get name
""
# 服务端返回完整内容:"$0rnrn"

null返回,即get不存在的key

127.0.0.1:6379> del name
(Integer) 1
127.0.0.1:6379> get name
(nil)
# 服务端返回完整内容:"$-1rn"

当服务器返回Null Bulk Strings时,客户端库应该转换为Null对象返回,而不要返回空字符。空字符串和nil是两个含义,空字符串代表键的值为'',nil代表键不存在

Arrays@H_696_22@

用作客户端想服务端发送命令时的内容格式,也用于服务端对一些命令的内容格式,如:LRANGE

格式:"*"开头,后跟整数表示数组长度,然后rn,后面是数组中的每个元素,他们可以是任意RESP类型(上面提到的Intergers、Bulk String等,格式如上),他们之间用rn分割,结尾rn

来看看set name Foo这条命令,client是怎么传给server的

127.0.0.1:6379> set name Foo
OK
# 客户端发的完整内容"*3rn$3rnsetrn$4rnnamern$3rnFoorn"
  • *3 代表这个内容是Arrays类型,并且长度为3,因为set name Foo有3个字符串
  • rn 分割符
  • $3 第一个字符串长度为3
  • rn 分割符
  • set 具体内容set
  • rn 分割符
  • $4 第二个字符串长度为4
  • name 具体内容name
  • rn 分割符
  • $3 第三个字符串长度为3
  • rn 分割符
  • Foo 具体内容Foo
  • rn 结尾

接着看看@H_926_26@mget name name1这条命令发出后,server返回的内容

127.0.0.1:6379> mget name name2
1) "Foo"
2) (nil)
# 服务端返回完成内容:*2rn$3rnFoorn$-1rn"
  • *2 代表这个内容是Arrays类型,并且长度为2,因为我们查了两个键namename2
  • rn
  • $3 第一个字符串长度为3
  • rn
  • Foo 具体内容Foo,即刚才set name Foo命令生效结果
  • rn
  • $-1 第二个字符串长度为-1,表示nil,不存在
  • rn

null数组表示

127.0.0.1:6379> blpop foo 1
(nil)
# 服务端返回完成内容: "*-1rn"

同样,客户端库也要区别null数组和空数组的区别。

总结

RESP协议的5种数据使用场景

什么是RESP?

大佬总结

以上是大佬教程为你收集整理的什么是RESP?全部内容,希望文章能够帮你解决什么是RESP?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。