Redis 通信协议简单研究

1.Redis网络通信协议

Redis底层网络通信协议其实是通过TCP来完成的。

2.Redis通信协议

Redis的通信协议首先是以行来划分,每行以\r\n行结束。每一行都有一个消息头,消息头共分为5种分别如下:
(+) 表示一个正确的状态信息,具体信息是当前行+后面的字符。
(-) 表示一个错误信息,具体信息是当前行-后面的字符。
(*) 表示消息体总共有多少行,不包括当前行,*后面是具体的行数。
(\() 表示下一行数据长度,不包括换行符长度\r\n,\)后面则是对应的长度的数据。
(:) 表示返回一个数值,:后面是相应的数字节符。
举个例子:

*3\r\n  #消息一共有三行
$3\r\n #第一行有长度为3
set\r\n #第一行的消息
$4\r\n  #第二行长度为4
demo\r\n #第二行的消息
$6\r\n #第三行长度为6
123456\r\n #第三行的消息
+OK\r\n #操作成功

3.使用Wireshark 追踪Redis通信

本人使用的是mac电脑,以下都是在mac下的操作

3.1安装redis

(1)直接使用命令安装

brew install redis

(2)启动redis-server

redis 默认开启6379端口

redis-server /usr/local/etc/redis.conf  #启动的时候指定配置文件

效果图:

(3)使用redis-cli 连接redis-server

redis 可以看做是c/s架构的软件,再打开一个终端输入下面的指令

redis-cli -h 192.168.0.102 -p 6379

效果图:

(4)简单的操作一些

keys *  # 查看全部的可以
set demo 123 #设置k-v
TTL demo #查看demo的时间
flushall #清除全部的缓存
quit #退出客户端

3.2 安装wireshark

wireshark是付费的,可以在网上查找体验版(破解版),有条件的建议购买正版。

(1)打开wirshark:

我这个地方选择的Loopback:lo0,因为我redis安装到本地了,实际上redis-server和redis-cli 都在127.0.0.1上,要选择该方式才能时间服务器端和客户端通信。如果我们通过redis-cli连接的是远程服务器上的redis-server,可以选择WI-FI:en0(我这里是这个网卡,可根据自身电脑选择相应的网卡)

(2) 追踪redis-cli 连接到服务时候的通信
我们追踪tcp流

得到如下结果

我们得到都是以 *,$,:,+等等来标注的。关于连接的操作太过于复杂,没有做详细的研究,下面看下简单的set指令。

可以看出跟我们文章刚开始举得例子一致,redis就是采用这种通信协议来通信的,掌握了redis通信协议,我们可以自己实现一个redis客户端,这都是很简单的。

原文地址:https://www.cnblogs.com/nele/p/8908298.html

时间: 2024-10-14 14:46:27

Redis 通信协议简单研究的相关文章

Redis源码研究—哈希表

Redis源码研究-哈希表 Category: NoSQL数据库 View: 10,980 Author: Dong 作者:Dong | 新浪微博:西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址:http://dongxicheng.org/nosql/redis-code-hashtable/ 本博客的文章集合:http://dongxicheng.org/recommend/ 本博客微信公共账号:hadoop123(微信号为:hadoop-123),分享

Redis 通信协议

本文和大家分享的主要是redis 通信协议相关内容,一起来看看吧,希望对大家 学习redis有所帮助. 几乎所有的主流编程语言都有Redis 的客户端,不考虑 Redis 非常流行的原因,如果站在技术的角度看原因还有两个: 1.  客户端与服务端之间的通信协议是在  TCP 协议  之上构建的. 客户端和服务器通过 TCP  连接来进行数据交互, 服务器默认的端口号为  6379  . 客户端和服务器发送的命令或数据一律以  \r\n  (CRLF )结尾. 1. Redis 制定了  RESP

基于redis 内存数据库简单使用

在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个命令窗口输入如下命令:redis-server  或redis-server  redis根目\redis.conf 服务器已经开启了,注意端号是6377 2.在eclipse 创建一个项目,把redist需要的包导入项目中 3.写一个Jedis工具类 public class JedisUtil 

Node.js操作Redis的简单示例

Redis是一个key-value类型的数据库,而key全部都是字符串,value可以是集合.hash.list等等. Redis是通过MULTI/DISCARD/EXEC/WATCH这4个命令来实现事务功能.对事务,我们必须知道事务安全性是一个非常重要的. 事务提供了一种"将多个命令打包,然后一次性.按顺序执行"的机制,并且在事务执行期间不会中断--意思就是在事务完成之前,客户端的其他命令都是阻塞状态. var redis = require("redis");

Redis的简单了解以及主从复制

1.Redis的简单了解 Redis是一种高性能的分布式NoSql数据库,持久存储,高并发,数据类型丰富,通过现场申请内存空间,同时可以配置虚拟内存.五种数据类型:string(字符串,这种格式和memcache是一致的).hash(哈希).list(列表,包括队列和栈).set(集合).zset(有序集合),使用key-value对的时候,可以直接存入对象,无需进行序列化,默认的使用了.net中自己的序列化,进行处理,所以也会出现对象循环引用的问题,此时需要使用json.net序列化为字符串,

Redis构建简单的主从复制

Redis构建简单的主从复制 原理: 当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来.后台进程完成写文件 后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上. 配置前提,关闭防火墙或允许redis端口通行 Centos7 IP:1

Redis 的简单运算

Redis 的简单运算 命令 说明 备注 incr key 在原字段上加 1 只能对整数操作 incrby key increment 在原字段上加上整数 (increment) 只能对整数操作 decr key 在原字段上减 1 只能对整数操作 decrby key decrement 在原字段上 减去 整数 (decrement) 只能对整数操作 incrbyfloat key increment 在原字段上加上浮点数 (increment) 可以操作浮点数 或者 整数 C:\Users\o

python redis 实现简单的消息订阅

python + redis 实现简单的消息订阅 订阅端 import redis from functools import wraps class Subscribe: def __init__(self, channel: str, **kwargs): self.coon = redis.StrictRedis(**kwargs) self.channel = channel self.registerd = list() self.course = self.coon.pubsub()

Redis 通信协议-了解 Redis 客户端实现原理

简介 几乎所有的主流编程语言都有Redis的客户端(http://redis.io/clients),不考虑Redis非常流行的原因,如果站在技术的角度看原因还有两个: 客户端与服务端之间的通信协议是在 TCP 协议之上构建的. 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 . 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾. Redis制定了 RESP(REdis Serialization Protocol,Redis序列化协议)实现客户