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
相关推荐
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
parade岁月1 天前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端
用户3169353811831 天前
MySQL服务无法启动问题解决全记录
数据库
vivo互联网技术1 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
倔强的石头_2 天前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库