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作为它的通讯协议。在技术领域性能并不是一切,还有简单性、易理解性和易实现性,这些都是需要进行适当权衡的。