首页
web前端
html5+css3
JavaScript
jquery
processing&P5.js
AngularJS
web前端技术
nodejs
php
wordpress
asp.net
xamarin.android
xamarin.ios
css属性在线排序工具
菜单
前端撸码笔记
成功指南:把撸鸟的时间都放在撸码上
RSS 订阅
RSS
您当前位置:
首页
»
nodejs
» 从Redis谈起(四)—— Redis协议详解,一个简单的客户端
从Redis谈起(四)—— Redis协议详解,一个简单的客户端
2016年7月15日 |
蒙奇·D·撸码客
∇
发表评论
(0)
⊕
查看评论
协议
协议是指两个实体(群)之间通信的约定标准,本文主要探讨Redis服务端和客户端交互的协议,其余集群相关的协议留待以后探讨。
协议算是一个必要而伟大的发明。A和B语言不通,但他们可以通过彼此都熟知的方式交流,比如肢体语言,肢体语言在这里就是协议。语言只是交流的一种表现形式,真正的交流与语言无关,就像最早翻译英文的神人,猜想也是用上了肢体语言的吧。除了Redis协议,语言翻译,还有诸如食谱、药方、API都是协议的表现形式,甚至编程语言也可以理解为程序员与机器之间的协议(当然有编译过程)。协议是一种规范,是为了通信双方能在同样的语境下交流,能看得懂,不出错。
Redis协议
Redis协议是基于TCP的,最后都是字节流,一些控制字符加上数据,就是整个协议。(编程语言是关键字加上代码)
首先来看看Redis协议里的对象类型:
(1)简单字符串,首字符是‘+’,其后是字符串内容
(2)错误,首字符是’-‘,其后是错误信息
(3)整数,首字符是’:’,其后是一个整数
(4)定长字符串,首字符是’$’,其后是字符串长度,下面跟字符串,特殊的可以用 “$-1\r\n” 来表示来表示NULL
(5)数组,首字符是’*’,其后是数据长度,下面是数组内容
Redis客户端和服务端通信都基于这五种基本对象,客户端向服务端只会发送定长字符串数据,服务端会根据命令执行结果返回上面的对象类型。比如一个简单的SET命令 “SET a 12″,表示成Redis协议如下:”*3\r\n$3\r\nSET\r\n$1\r\na\r\n$2\r\n12\r\n”,其中 “\r\n” Redis用来分隔每个对象,上传命令服务端的回复是 “+OK\r\n”,表示命令执行成功。
其它的命令可以用tcpdump抓包并用wireshark分析,tcpdump命令是:
sudo tcpdump -nn -i lo0 port 6379 -w wire.cap
然后用wireshark分析包即可,强烈建议实际动手操作一下,对协议的理解大有好处。
Redis客户端——C简陋版
协议搞清楚了,下面简单实验一下,调用一下“SET a 12”这个命令。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int cPort = 6379;
int cClient = 0;
int cLen = 0;
struct sockaddr_in cli;
char cbuf[4096] = {0};
memset(cbuf, 0, sizeof(cbuf));
cli.sin_family = AF_INET;
cli.sin_port = htons(cPort);
cli.sin_addr.s_addr = inet_addr(“127.0.0.1”);
cClient = socket(AF_INET, SOCK_STREAM, 0);
if (cClient < 0) {
printf(“socket() failure!\n”);
return -1;
}
if (connect(cClient, (struct sockaddr*)&cli, sizeof(cli)) < 0) {
printf(“connect() failure!\n”);
return -1;
}
//send command
char command[] = “*3\r\n$3\r\nSET\r\n$1\r\na\r\n$2\r\n12\r\n”;
if (send(cClient, command, sizeof(command), 0) == -1) {
printf(“send failure\n”);
return -1;
}
cLen = recv(cClient, cbuf, sizeof(cbuf), 0);
if ((cLen < 0) || (cLen == 0)) {
printf(“recv() failure!\n”);
return -1;
}
printf(“recv() Data From Server: [%s]\n”, cbuf);
close(cClient);
return 0;
}
nodejs
内容推荐
nodejs实战案例(Express框架+mongoDB)之3:路由,摸版引擎基础知识
css阴影:box-shadow属性解析
js 省市区无刷新三级联动
Xamarin循环问题
原生JavaScript模拟jquery的ajax的部分功能(含jsonp)
Express调试nodejs代码
php正则替换图片src解决wordpress头像加载不了问题
AngularJS开发指南31:测试服务
分类:
AngularJS
,
web前端
| 标签:
AngularJS入门
«
AngularJS开发指南30:管理服务依赖
AngularJS开发指南32:理解服务
»
发表评论?
0 条评论。
发表评论
取消回复
要发表评论,您必须先
登录
。
热搜标签
JS实用代码
AngularJS入门
jquery实用代码
css实用代码
Processing
nodejs express
nodejs
web前端性能优化
nodejs实战案例
nodejs校花采集
Redis
wordpress实用代码
Xamarin代码片段
php实用代码
php正则
javascript prototype
Xamarin
CSS书写规范
canvas
HTTP协议
web前端技术
https
css选择器
CSS3动画
百度地图API
js原型链
ajax
js正则
transform Matrix
JavaScript
wordpress下载
微信小程序
meta标签
c#实用代码
asp.net实用代码
HtmlHelper
jquery基础知识
css基础知识
Xamarin制作Toast
javascript类
.htaccess
webview
httpd.ini伪静态
JavaScript学习心得
非主流前端
近期文章
powershell安装.msi文件
Vue生产环境调试的方法步骤_vue.js
批量匹配块注释的正则
最新省市区JSON数据,截至2022年
知乎的全网置灰css代码
div获取宽高位置 getBoundingClientRect
记一次2020年青岛本科人才落户的经历
移动端适配问题
jquery ajax拦截器
微信小程序申请的几个小坑
0 条评论。