Redis从1.2版本开始,设计了一套统一的协议格式,作者讲到自己设计的协议在下面几个方面进行了权衡:
1. 实现简单
2. 快速通过计算机解析
3. 容易让人阅读
如果我们需要自己实现一个Redis客户端程序,有必要了解一下Redis的协议格式。在网络层面,客户端通过TCP连接到Redis服务器(默认端口6379,可以通过配置文件修改),客户端与服务器之间发送的命令以\r\n(CR LF)结尾。
请求协议
Redis请求参数的通用格式如下:
*<参数数量> CR LF
$<第1个参数字节数> CR LF
<参数数据> CR LF
...
$<第N个参数字节数> CR LF
<参数数据> CR LF
举个例子,要使用SET命令在Redis中存储一条key=mykey,value=myvalue的数据,则客户端发送给Redis的服务器协议如下:
*3
$3
SET
$5
mykey
$7
myvalue
最终发给Redis服务器的二进制数据用字符串表示是:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
应答协议
Redis的应答命令分为不同的种类,每种应答使用不同的表示方式,下面逐一说明。
1. 单行应答:使用“+”开始,后面跟应答字符串,以\r\n结尾,客户端实现给应用程序返回“+”后面的内容,如:
+OK\r\n
2. 错误应答:与单行应答类似,只不过以“-”开始,如:
-(error) ERR unknown command 'INC'\r\n
3. 整数应答:使用“:”开始,后面跟应答内容(表示整数的字符串),以\r\n结尾,如:
:1000\r\n
4. Bulk应答:如使用GET命令获取一个字符串,服务器会使用Bulk应答,使用“$”开始,后面跟应答数据字节数(+\r\n),再加上应答数据,最后以\r\n结尾,如:
$7\r\nmyvalue\r\n
如果没有获取到结果(如请求的Key不存在),服务器将会应答-1,如:
$-1
5. 批量应答:有些命令如LRANGE等,需要返回多个应答值,此时Redis采用与请求命令相同的协议格式发送应答:
*4
$3
foo
$3
bar
$5
hello
$5
world
客户端接收到的二进制数据用字符串表示:
*4\r\n$3\r\nfoo\r\n$3\r\nbar\r\n$5\r\nhello\r\n$5\r\nworld\r\n
如果没有获取到结果,服务器会应答-1,如:
*-1
其他说明
1. Redis支持Pipelining把多个命令打包在一起发送以减少RTT,详细信息请参考官网这篇文章。
2. 在Redis 2.2版本中提供了基于C的客户端hiredis(以前也提供,但是2.2版本进行了大规模的重构),在实现一个客户端时是一个很好的参考。
Redis使用系列通过三篇文章:配置文件分析、功能示例和协议,为大家介绍了Redis的使用。接下来是时候去看看Redis的源码,并通过源码分析内部实现,如VM机制、字符串实现等,Redis源码分析系列见。
分享到:
相关推荐
在本篇中,我们将深入探讨如何安装和使用Redis客户端,特别是针对Windows 32位系统的“redisclient-win32.x86.1.0.exe”安装包。 1. Redis客户端介绍: Redis客户端是连接到Redis服务器并执行命令的工具,它们可以...
【IT互联网名企经典面试题汇总:Java篇】 在IT行业面试中,Java开发者常常会遇到一系列关于核心技术、设计原则以及实践经验的问题。以下是一些Java相关的面试知识点: 1. **线程状态**:Java线程有新建(New)、...
- **防护措施**:使用预处理语句、过滤用户输入、设置安全的会话管理策略等。 #### 四、Linux服务搭建 **4.1 Nginx/Apache+PHP-FPM+项目代码管理** - **Nginx/Apache**:Web服务器,负责处理HTTP请求。 - **...
这篇文档主要涉及了在Java开发环境中安装和运行多个关键组件,包括JDK、MySQL、Redis、RabbitMQ以及Elasticsearch。以下是对这些知识点的详细解释: 一、环境要求 1. **Jdk**:Java Development Kit,是Java编程...
- **资源服务**:使用Minio进行统一存储和管理,实现视频、音频、图片的断点续传和MD5校验。 - **订单服务**:集成支付宝和微信支付,实现第三方平台课程的付费购买。 - **认证授权服务**:基于Spring Security和...
根据给定文件的信息,我们可以梳理出一系列与IT面试相关的知识点,尤其聚焦于Java技术栈、数据库、前端技术等。下面将对这些知识点进行详细的解读。 ### Spring Boot 面试题 1. **Spring Boot 的核心特性是什么?*...
"Java技能百练--数据库篇"可能涵盖了一系列关于如何使用Java与各种数据库进行交互的教程或实践项目。这个压缩包文件很可能是为了帮助开发者提升在Java环境中处理数据库的能力而设计的。 在Java中,我们通常使用JDBC...
- 理解TCP和UDP协议,会使用Socket编程。 9. **反射机制** - 反射用于在运行时获取类的信息并动态操作类的对象。 10. **设计模式** - 掌握常见的设计模式,如单例、工厂、装饰器、观察者等。 11. **JVM** - ...
Java作为一门广泛使用的编程语言,其在分布式应用领域的应用非常广泛。本篇内容将深入探讨分布式Java应用的基础概念、设计原则以及实战技巧。 1. 分布式系统概述 分布式系统是由多台独立的计算机节点通过网络相互...
- 集成测试:使用Selenium或JMeter模拟用户行为,测试系统整体性能。 - 部署:Docker容器化部署,Kubernetes进行集群管理。 通过这个基于Java的在线购物系统设计与实现,学生不仅可以学习到Web开发的基本技能,还...
- **Gossip Protocol**:一种用于维护分布式系统中节点间状态同步的协议。 - **Merkle Tree**:一种树形数据结构,用于高效验证大量数据的一致性。 - **Paxos**:一种解决分布式系统中一致性问题的经典算法。 - **...
Redis是指使用Redis来实现键值存储。 Scalaris是指使用Scalaris来实现键值存储。 Tokyo cabinet / Tyrant是指使用Tokyo cabinet / Tyrant来实现键值存储。 CT.M是指使用CT.M来实现键值存储。 Scalien是指使用...
- **NoSQL**:了解MongoDB、Redis等非关系型数据库的特点和使用场景。 4. **网络篇** - **TCP/IP协议**:理解网络通信的基本原理,包括TCP、UDP协议,三次握手四次挥手等。 - **HTTP协议**:掌握HTTP请求方法、...
- **Quorum**: 一致性协议中的一种机制,用于确定数据读取或写入所需的节点数量。 - **NRW**: 表示Not Ready Write,即允许数据写入时可以不立即同步到所有副本节点。 **3. Vector Clock** - 一种多版本时间戳方案...
1. MVC模式:使用SpringBoot的Web MVC功能,实现前端视图、控制器和模型的分离,提高代码可维护性。 2. 数据库交互:利用Spring Data JPA或MyBatis进行数据库操作,支持ORM(对象关系映射)。 3. 安全控制:集成...
1. **网络通信模块**:使用HttpURLConnection或者OkHttp等网络库进行网络请求,实现与服务器的交互,通常包括登录验证、发送接收消息等功能。 2. **消息处理模块**:处理服务器返回的数据,如解码JSON或XML格式的...
2. **数据库设计**:使用SQL进行数据建模,可能涉及到关系数据库管理系统(如MySQL),以及ORM工具(如Hibernate或MyBatis)。 3. **前端技术**:可能包括HTML、CSS、JavaScript,以及前端框架如React或Vue.js来构建...
可以使用编程语言内置的随机数函数,如Python的`random`库或Java的`Random`类,结合哈希函数(如MD5、SHA系列)进行加密处理,增加安全性。 2. **独立导出卡号与密码**:系统需支持卡号与密码的独立管理。这意味着...
- 《Unsafe Pointer Chasing》这篇文章指出了使用`Unsafe`时需要特别注意的地方,尤其是在处理堆内存中的对象地址时。 - 《Compact Off-Heap Structures & Tuples in Java》是Martin Thompson撰写的一篇关于如何在...