Redis 协议详解与 Telnet 直接连redis

Redis 协议详解与 Telnet 直接连redis

1. Redis 协议结构

1.1 RESP协议基础

  • RESP (Redis Serialization Protocol):Redis 专用的序列化协议
  • 文本协议:基于 ASCII 文本,可读性好
  • 请求响应模式:客户端发送请求,服务器返回响应

1.2 协议数据类型结构

  • 简单字符串 :以 + 开头,CRLF 结尾
  • 错误信息 :以 - 开头,CRLF结尾
  • 整数 :以 : 开头,CRLF 结尾
  • 批量字符串 :以 $ 开头,包含长度和数据
  • 数组 :以 * 开头,包含元素数量和内容

1.3 协议格式规则

  • 所有行以 \r\n (CRLF) 结尾
  • 批量字符串格式:$<length>\r\n<data>\r\n
  • 数组格式:*<count>\r\n<element1>...<elementN>
  • 长度值为 -1 表示空值 (null)

2. Telnet 连接 Redis

2.1 连接命令

复制代码
telnet 192.168.16.16 6379

2.2 连接验证

  • 连接成功后显示:Connected to 192.168.16.16
  • 可以开始输入 Redis 命令

3. Redis 协议数据类型示例

3.1 简单字符串示例

复制代码
客户端发送:PING
服务器响应:+PONG\r\n

3.2 错误信息示例

复制代码
客户端发送:INVALID_COMMAND
服务器响应:-ERR unknown command 'INVALID_COMMAND'\r\n

3.3 整数示例

复制代码
客户端发送:INCR counter
服务器响应::1\r\n

3.4 批量字符串示例

复制代码
客户端发送:GET testkey
服务器响应:$5\r\nhello\r\n (表示长度为5的字符串"hello")

3.5 数组示例

复制代码
客户端发送:LRANGE list 0 -1
服务器响应:*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n (表示包含两个元素的数组)

4. Redis 命令操作示例

4.1 基础字符串操作

SET 命令 (使用数组格式)
复制代码
*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
GET 命令 (使用数组格式)
复制代码
*2\r\n$3\r\nGET\r\n$3\r\nkey\r\n

4.2 哈希操作示例

HSET 命令
复制代码
*4\r\n$4\r\nHSET\r\n$4\r\nhash\r\n$4\r\nfield\r\n$5\r\nvalue\r\n
HGETALL 命令
复制代码
*2\r\n$7\r\nHGETALL\r\n$4\r\nhash\r\n

4.3 列表操作示例

LPUSH 命令
复制代码
*3\r\n$5\r\nLPUSH\r\n$5\r\nmylist\r\n$5\r\nvalue\r\n
LRANGE 命令
复制代码
*4\r\n$6\r\nLRANGE\r\n$5\r\nmylist\r\n:0\r\n:-1\r\n

4.4 集合操作示例

SADD 命令
复制代码
*3\r\n$4\r\nSADD\r\n$6\r\nmyset\r\n$5\r\nvalue\r\n
SMEMBERS 命令
复制代码
*2\r\n$8\r\nSMEMBERS\r\n$6\r\nmyset\r\n

4.5 有序集合操作示例

ZADD 命令
复制代码
*4\r\n$4\r\nZADD\r\n$7\r\nmyscore\r\n:100\r\n$4\r\nuser\r\n

5. 实际操作示例

5.1 连接并测试

复制代码
$ telnet 192.168.16.16 6379
Connected to 192.168.16.16
Escape character is '^]'.

PING
+PONG

SET testkey "Hello Redis"
+OK

GET testkey
$11
Hello Redis

5.2 批量操作示例

复制代码
*3\r\n$3\r\nSET\r\n$5\r\nname1\r\n$4\r\nJohn\r\n
+OK

*2\r\n$4\r\nKEYS\r\n$1\r\n*\r\n
*1
$5
name1

6. 协议解析要点

6.1 换行符规则

  • 所有 Redis 协议行以 \r\n (CRLF) 结尾
  • 不要忘记添加换行符

6.2 长度计算

  • 批量字符串和数组需要指定元素数量或长度
  • 长度是指内容的字节数,不是字符数

6.3 特殊值处理

  • $-1\r\n 表示空值 (null)
  • *-1\r\n 表示空数组

7. 常见问题与解决方案

7.1 连接问题

  • 确认 Redis 服务器 IP 和端口正确
  • 检查防火墙设置
  • 确认 Redis 服务正在运行

7.2 协议格式错误

  • 确保所有命令行以 \r\n 结尾
  • 检查长度计算是否正确
  • 验证协议格式是否符合规范

7.3 权限问题

  • 如有密码保护,需要先执行 AUTH 命令

    AUTH yourpassword

8. 总结

  • Redis 协议结构简单,基于文本格式
  • 支持多种数据类型和丰富的命令集
  • Telnet 方式适合调试和测试 Redis 服务
  • 理解协议结构有助于更好地使用 Redis
相关推荐
存在的五月雨6 分钟前
Mysql 函数
数据库·mysql
m0_561359678 分钟前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
前方一片光明14 分钟前
SQL SERVER—将所有表的cjsj字段改为datetime2(0),去掉毫秒
数据库
老邓计算机毕设18 分钟前
SSM医院疫情管理系统e3oxi(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·医疗信息化·ssm 框架·医院疫情管理系统
diediedei24 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
砚边数影25 分钟前
决策树实战:基于 KingbaseES 的鸢尾花分类 —— 模型可视化输出
java·数据库·决策树·机器学习·分类·金仓数据库
weixin_4454023027 分钟前
Python游戏中的碰撞检测实现
jvm·数据库·python
亓才孓30 分钟前
[数据库]数据库
数据库
左灯右行的爱情32 分钟前
导出重复问题记录-bugs专辑
数据库·mysql
熊文豪33 分钟前
Oracle迁移KingbaseES:从痛点到破局之道
数据库·kingbasees·电科金仓