Redis原理----通信协议

Redis的作者认为数据库系统的瓶颈一般不在于网络流量,而是数据库自身内部逻辑处理上。所以即使Redis使用了浪费流量的文本协议,依然可以取得极高的访问性能。Redis将所有数据都放在内存,用一个单线程对外提供服务,单个节点在跑满一个CPU核心的情况下可以达到10w/s的超高QPS。

RESP

RESP(Redis Serialization Protocol)是Redis序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。

Redis歇息将传输的数据结构分为5种最小单元类型,单元结束时统一加上回车换行符号\r\n。

  • 单行字符以+符号开头
  • 多行字符以$符号开头,后跟字符串长度
  • 整数值以符号开头,后跟整数的字符串形式
  • 错误消息以-符号开头
  • 数组以*符号开头,后跟数组的长度

单行字符

1
+hello world\r\n

多行字符串

1
2
$11\r\n  
hello world\r\n

整数

1
:1024\r\n

错误

1
-WRONGTYPE Operation ....

数组[1,2,3]

1
2
3
4
*3\r\n  
:1\r\n
:2\r\n
:3\r\n

客户端->服务器

客户端向服务器发送的指令只有一种格式,多行字符串数组。比如一个简单的set指令set k v会被序列化成以下字符串。

1
2
3
4
5
6
7
*3\r\n  
$3\r\n
set\r\n
$1\r\n
k\r\n
$1\r\n
v\r\n

服务器->客户端

服务器向客户端恢复的响应要支持多种数据结构,所以消息响应在结构上要复杂不少。不过在复杂的响应消息也是以上的5种基本类型的组合。

小结

Redis协议里有大量冗余的回车换行符,但是这并不影响它成为互联网技术领域非常受欢迎的一个文本歇息。有很多开源项目目前使用RESP作为它的通讯协议。在技术领域性能并不是一切,还有简单性、易理解性和易实现性,这些都是需要进行适当权衡的。