Redis Protocol
数据类型
Redis协议种数据类型总共就5种,你拿到一坨字节后根据第一个字节来判断这一坨字节代表的是哪种数据类型,Redis协议实现起来比较简单,而且是human readable,可以说是文本协议。
1.Simple String
简单字符串类型,第一个字节是"+",后面跟着一个字符串,该字符串不能包含CR和LF,以CRLF("\r\n")结尾
比如"hello"编码为: "+hello\r\n"
"+hello\rworld\r\n"或者"+hello\nworld\r\n"是不合法的,如果串中包含"\r"或者"\n"等,你就不能编码为Simple String,而应该用Bulk String
2.Errors
错误类型,Errors再编码方式上和Simple String一样,除了第一个字节是"-"符号外。
比如"-Err unkown command 'fuck'",从‘-’到第一个空格间的内容为错误类型,不过这个类型并没有严格的标准,所以意义也不是很大
3.Integers
数值类型,第一个字节是‘:’,后面是数值,最后以"\r\n"结尾
例如20 编码为 ":20\r\n"
很多redis命令都是返回一个Integers,这个返回数值也没啥严格的意义,当是incr命令是数值代表incr后的值,当时lastsave时返回的是unix时间戳等等。不过可以保证该数值是64位的有符号整数,因此Java里恰好用long来表示。
返回布尔值的命令都是以Integers来替代的,1代表true,0代表false
所有返回Integers的命令如下:
SETNX, DEL, EXISTS, INCR, INCRBY, DECR, DECRBY, DBSIZE, LASTSAVE, RENAMENX, MOVE, LLEN, SADD, SREM, SISMEMBER, SCARD.
4.Bulk String
第一个字节是"$",用来传输二进制安全的字符串,最大长度为512MB
格式:$后面跟着一个整数N,表示字符串长度,后面跟着"\r\n",后面跟着实际的字符串(N个字节),最后以\r\n结尾。
例如"hello" 编码为 : "$5\r\nhello\r\n"
空字符串编码为:"$0\r\n\r\n"
值得注意的是,NUL编码为 "$-1\r\n",当收到NUL串时,redis-cli命令行辉提示"nil"字样,在Java里应该返回给用户NULL。
5.Arrays
数组类型,客户端给redis服务器发命令都是发一个Arrays 过去,有些命令有以Arrays响应,
第一个字节是' * ',后面跟着整数N,代表数组长度,后面跟着\r\n,后面跟着N个数组元素,每个数组元素都可以是上面说的任一类型(包括Arrays)。
例如array = [0, 1, "hello"]编码为:
*3\r\n:0\r\n:1\r\n$5\r\nhello\r\n
空数组编码为:
"*0\r\n"
NUL数组编码为:
"*-1\r\n"
当数组中某个元素为NUL时,比如数组array = [1, NUL],编码为:
"*2\r\n:1\r\n$-1\r\n"
发送命令
1.客户端发送一个Arrays,表示命令
2.服务端回应任一种数据类型作为响应。
例如要执行:LLEN mylist,则其序列如下:
C: *2\r\n C: $4\r\n C: LLEN\r\n C: $6\r\n C: mylist\r\n S: :48293\r\n
C为客户端,S为Server,上面发送的多行是为了方便看。实际是*2\r\n$4\r\nLLEN\r\n$6\r\nmylist\r\n
Java简单示例:执行命令get name, 期望返回值是"Jack":
package cc.lixiaohui.demo.redis; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; public class RedisClient { static final String CRLF = "\r\n"; public static void main(String[] args) throws Exception, IOException { Socket socket = new Socket("127.0.0.1", 6379); socket.getOutputStream().write(getCmd("name")); InputStream in = socket.getInputStream(); byte[] buf = new byte[1024];// 不循环读, 免得阻塞 int len = in.read(buf); socket.close(); byte[] resp = new byte[len]; System.arraycopy(buf, 0, resp, 0, len); System.out.println(resp.length); System.out.println(new String(resp)); } static byte[] getCmd(String key) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeBytes("*2"); dos.writeBytes(CRLF); dos.writeBytes("$3"); dos.writeBytes(CRLF); dos.writeBytes("get"); dos.writeBytes(CRLF); dos.writeBytes("$" + key.length()); dos.writeBytes(CRLF); dos.writeBytes(key); dos.writeBytes(CRLF); return baos.toByteArray(); } }
看看返回的字节:
参考ASCII码表后,以上字节序列即为:$ 4 \r \n J a c k \r \n
相关推荐
源文件格式key,value ==》 经过处理后*3$3set$3key$5value 使用方式LANG=C ./sample.awk test.csv | redis-cli --pipe -h 127.0.0.1 -p 6379
在C或C++中与Redis交互,通常有两种方式:直接使用Redis命令行协议(Redis Protocol)编写网络IO代码,或者使用已有的客户端库。本案例中,我们采用的是后者,即利用封装好的动态库文件(通常为.lib或.dylib)进行...
7. **命令与协议**:Redis使用简单明了的命令行协议(Redis Protocol)进行通信,客户端通过发送命令来操作数据。例如,`SET key value`用于设置键值,`GET key`用于获取键的值。 8. **持久化**:Redis提供了两种持久...
redis-protocol 是一个非常快速的 Redis 的 Java 客户端实现。同时还包含了嵌入式的 Redis 服务器端的 Java 实现。基于 Netty 开发。 标签:redis
Go语言实现Redis客户端,首先需要理解Redis的命令协议(Redis Protocol),它是一种简单的基于行的文本协议。在“myredis-master”项目中,可能会包含解析和构建这种协议的代码。例如,实现`*`、`$`、`+`、`:`等不同...
第 1 章Redis 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
第 1 章Redis 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
redis-protocol-example 用 Go 来了解一下 Redis 通讯协议,本项目支持 Redis 的五种通讯协议,如下: 状态回复(status reply) 错误回复(error reply) 整数回复(integer reply) 批量回复(bulk reply) 多条...
>>> from redis_protocol import decode, encode >>> encode("ping") # encode a request ... '*1\r\n$4\r\nping\r\n' >>> decode('*1\r\n$4\r\nping\r\n') # decode a request body ... ["ping"] >>> decode("$6\r\...
今天在写zabbix storm job监控脚本的时候用到了python的redis模块,之前也有用过...redis.StrictRedis Implementation of the Redis protocol.This abstract class provides a Python interface to all Redis commands
9. **网络协议**: Redis基于简单高效的RESP(REdis Serialization Protocol)协议,易于实现客户端。 10. **模块系统**: 自Redis 4.0起,引入了模块系统,允许扩展其功能,如Geo索引、图数据库等。 在Redis-x64-...
资源分类:Python库 所属语言:Python 资源全名:redis_protocol-0.0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在Redis 2.6版本以后,可以通过直接向服务器发送遵循Redis协议的文本文件来实现批量插入,这种方式称为Redis Protocol的直接导入。具体步骤如下: 1. 创建一个文本文件,其中包含一系列Redis命令,例如`SET Key0 ...
关于Redis的图形化客户端,这里提到的是一个名为RESP的工具,可能是指RESP (Redis Serialization Protocol) 的一个图形界面。 RESP是Redis通信协议,用于客户端与服务器之间的数据交换。图形化客户端通常能提供更...
npm i redis-writable const toWritable = require ( 'redis-writable' ) ; console . log ( toWritable ( 'SET' , [ 'foo' , 'bar' ] ) ) ; // *3 // $3 // SET // $3 // foo // $3 // bar 基准测试 Platform info...
描述中提到的“RESP_app”是一个Redis响应协议(REdis Simple String Protocol)的应用程序,可能是一个图形用户界面(GUI)工具,用于管理和操作Redis服务器。RESP是Redis默认的通信协议,它使得客户端与服务器之间...
3. **网络通信协议**:Redis使用自定义的简单易用的REPLICA(RESP,Redis Serialization Protocol)协议,支持多种编程语言的客户端。 4. **主从复制**:Redis支持主从复制,可以创建多个副本节点,用于数据备份和...
5. 协议支持:Redis使用简单明了的RESP(REdis Serialization Protocol)协议,易于与其他语言的客户端库集成。 二、Redis 7.2.4新特性: 1. 性能优化:每个新版本都会针对特定场景进行性能优化,7.2.4也不例外,...
4.Redis protocol:使用Redis传输协议,提高系统的性能和可扩展性。 5.异步调用支持:使用异步调用支持,提高系统的性能和可扩展性。 监控机制 陌陌服务化架构实践的监控机制包括: 1.日志平台:使用日志平台,...