105 lines
2.5 KiB
C#
105 lines
2.5 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Text;
|
||
|
||
namespace CYQ.Data.Cache
|
||
{
|
||
/*
|
||
协议规范
|
||
|
||
redis允许客户端以TCP方式连接,默认6379端口。传输数据都以\r\n结尾。
|
||
|
||
请求格式
|
||
|
||
*<number of arguments>\r\n$<number of bytes of argument 1>\r\n<argument data>\r\n
|
||
|
||
例:*1\r\n$4\r\nINFO\r\n
|
||
|
||
响应格式
|
||
|
||
1:简单字符串,非二进制安全字符串,一般是状态回复。 +开头,例:+OK\r\n
|
||
|
||
2: 错误信息。 -开头, 例:-ERR unknown command 'mush'\r\n
|
||
|
||
3: 整型数字。 :开头, 例::1\r\n
|
||
|
||
4:大块回复值,最大512M。 $开头+数据长度。 例:$4\r\mush\r\n
|
||
|
||
5:多条回复。 *开头, 例:*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
|
||
*/
|
||
/// <summary>
|
||
/// RedisCommand
|
||
/// </summary>
|
||
internal class RedisCommand : IDisposable
|
||
{
|
||
MSocket socket;
|
||
public RedisCommand(MSocket socket, int commandCount, string command)
|
||
{
|
||
this.socket = socket;
|
||
Write(string.Format("*{0}\r\n", commandCount));
|
||
WriteKey(command);
|
||
}
|
||
private void Write(string cmd)
|
||
{
|
||
WriteData(Encoding.UTF8.GetBytes(cmd));
|
||
}
|
||
private void WriteHeader(int bodyLen)
|
||
{
|
||
Write("$" + bodyLen + "\r\n");
|
||
}
|
||
public void WriteKey(string cmd)
|
||
{
|
||
byte[] data = Encoding.UTF8.GetBytes(cmd);
|
||
|
||
WriteHeader(data.Length);
|
||
|
||
WriteData(data);
|
||
Write("\r\n");
|
||
}
|
||
public void WriteValue(string value)
|
||
{
|
||
WriteKey(value);
|
||
}
|
||
public void WriteValue(byte[] data1)
|
||
{
|
||
WriteValue(data1, null);
|
||
}
|
||
public void WriteValue(byte[] data1, byte[] data2)
|
||
{
|
||
int len = data1.Length;
|
||
if (data2 != null)
|
||
{
|
||
len += data2.Length;
|
||
}
|
||
WriteHeader(len);
|
||
WriteData(data1);
|
||
if (data2 != null)
|
||
{
|
||
WriteData(data2);
|
||
}
|
||
Write("\r\n");
|
||
}
|
||
private void WriteData(byte[] cmd)
|
||
{
|
||
socket.Write(cmd);
|
||
}
|
||
|
||
|
||
|
||
public void Reset(int commandCount, string command)
|
||
{
|
||
Write(string.Format("*{0}\r\n", commandCount));
|
||
WriteKey(command);
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|