自己动手写Redis客户端(C#实现)2 - SET请求和状态回复(set)
Redis请求协议的一般形式:
*<参数数量> CR LF
$<参数 的字节数量> CR LF
<参数 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF
备注:CR表示为\r; LF表示\n
下面是一个例子:
*
$
SET
$
mykey
$
myvalue
Redis回复
Redis 命令会返回多种不同类型的回复。
通过检查服务器发回数据的第一个字节, 可以确定这个回复是什么类型:
- 状态回复(status reply)的第一个字节是
"+" - 错误回复(error reply)的第一个字节是
"-" - 整数回复(integer reply)的第一个字节是
":" - 批量回复(bulk reply)的第一个字节是
"$" - 多条批量回复(multi bulk reply)的第一个字节是
"*"
实现代码(C#)
1、 通过Socket 连接 Redis:
// 通过Socket 连接 redis
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect("127.0.0.1", );
2、发送指令
string key = "SetKeyTest"; // 设置 的key
string value = "设置的值"; // 设置的值
StringBuilder sbSend = new StringBuilder();
sbSend.Append("*3\r\n"); // 参数数量 3
string cmd = "SET";
sbSend.Append("$" + Encoding.UTF8.GetBytes(cmd).Length + "\r\n"); // 参数1的长度
sbSend.Append(cmd + "\r\n");// 参数1( SET指令 ) sbSend.Append("$" + Encoding.UTF8.GetBytes(key).Length + "\r\n"); // 参数2的长度
sbSend.Append("" + key + "\r\n");// 参数2(Set 的 Value) sbSend.Append("$" + Encoding.UTF8.GetBytes(value).Length + "\r\n"); // 参数3的长度
sbSend.Append("" + value + "\r\n");// 参数3(Set 的 Value)
Console.WriteLine("发送的命令:");
Console.Write(sbSend.ToString());
byte[] data = Encoding.UTF8.GetBytes(sbSend.ToString()); // 把请求转换为byte数组
3、接收回复
byte[] result = new byte[];
int resultLength = s.Receive(result); // 接收回复 // 根据接收到的数据长度重新组装一个结果
byte[] newResult = new byte[resultLength];
for (int i = ; i < resultLength; i++)
{
newResult[i] = result[i];
}
string strResult = Encoding.UTF8.GetString(newResult); // 把结果转换为string
Console.Write(strResult);
Console.Write(strResult.Trim() == "+OK" ? "设置成功!": "设置失败!"); // 判断设置是否成功
执行效果


自己动手写Redis客户端(C#实现)2 - SET请求和状态回复(set)的更多相关文章
- 自己动手写Redis客户端- Redis协议(1)
网络层 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 . 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾. 请求 Redis 服务器接受命令以及命 ...
- 自己动手写Redis客户端(C#实现)4 - 整数回复
整数回复 整数回复就是一个以 ":" 开头, CRLF 结尾的字符串表示的整数. 比如说, ":0\r\n" 和 ":1000\r\n" 都 ...
- 自己动手写Redis客户端(C#实现)3 - GET请求和批量回复
实现代码(C#) 1.发送GET指令 string keyGet = "SetKeyTest"; // 设置 的key StringBuilder sbSendGet = new ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...
- 用C、python手写redis客户端,兼容redis集群 (-MOVED和-ASK),快速搭建redis集群
想没想过,自己写一个redis客户端,是不是很难呢? 其实,并不是特别难. 首先,要知道redis服务端用的通信协议,建议直接去官网看,博客啥的其实也是从官网摘抄的,或者从其他博客抄的(忽略). 协议 ...
- 手写redis客户端
一.RESP通信协议 Redis Serialization Protocol (Redis序列化协议). 特点:容易实现.解析快.可读性强 以\r\n分割数据. 二.撸代码 package com. ...
- 用BIO手写实现Redis客户端的探究(拒绝Jedis)
在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce.因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结. Redis通讯 ...
- 解决ASP.NET中Redis 每小时6000次访问请求的问题
原文:解决ASP.NET中Redis 每小时6000次访问请求的问题 虽然ServiceStack v4是商业支持的产品,但我们也允许免费使用小型项目和评估目的.上面的NuGet包中包含可以使用许可证 ...
- 学习T-io框架,从写一个Redis客户端开始
前言 了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...
随机推荐
- pandas技巧两则——列内元素统计和列内元素排序
更新:后来忽然发现有个cumcount()函数,支持正排倒排,所以以下说的那些基本都没啥用了. 最近做比赛线上无甚进展,所以先小小地总结遇到的一些困难和解决的方法,以防之后忘记.毕竟总是忙着大步赶路的 ...
- 解决springboot jar包冲突
直接导入springboot父项依赖,其它相关springboot依赖version不用写,由spring自动依赖. <parent> <groupId>org.springf ...
- OS + CentOS cmake
s Linux编译安装cmake最新版本 https://blog.51cto.com/sadoc/1910753 https://cmake.org/download/ https://github ...
- [译]Ocelot - Quality of Service
原文 可以针对每个ReRoute设置对下游服务的熔断器circuit breaker.这部分是通过Polly实现的. 将下面的配置添加到一个ReRoute下面去. "QoSOptions&q ...
- vue.js学习系列-第一篇(代码)
<html> <head> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> ...
- mysql数据库 表 导入导出
1.导出表结构 mysqldump --no-data -h192.168.222.11 -uroot -proot --databases db01 db02 db30>file.sql 2. ...
- LeetCode第十六题-找出数组中三数之和最接近目标值的答案
3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...
- Python爬虫从入门到进阶(3)之requests的使用
快速上手(官网地址:http://www.python-requests.org/en/master/user/quickstart/) 发送请求 首先导入Requests模块 import requ ...
- mysql插入大数据
/*部门表*/ CREATE TABLE dept( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, /*id*/ deptno MEDIUMINT UNSIG ...
- 关于typecho0.9代码高亮与数学公式支持
闲来无事,搭了一个博客,记录一下自己的学习生活,博客模板取自原来typecho官方博客,稍加修改,改了一下涂装,不得不说插件支持有一些问题,目前大多数插件已经同步更新到typecho1.0版本,新插件 ...