ZhiYeJianKang_PeiXun/cyqdata-master/Cache/Redis/RedisCommand.cs

156 lines
4.1 KiB
C#
Raw Normal View History

2025-02-20 15:41:53 +08:00
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
4512M $+ $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)
//{
//}
List<byte> command = new List<byte>();
public RedisCommand(MSocket socket)
{
this.socket = socket;
socket.Reset();
}
public RedisCommand(MSocket socket, int commandCount, string command)
{
this.socket = socket;
this.socket.Reset();
//Write(string.Format("*{0}\r\n", commandCount));
//WriteKey(command);
//听说redis verstion 2.8 不支持参数分开发送,所以打包一起发送。
string cmd = string.Format("*{0}\r\n${1}\r\n{2}\r\n", commandCount, Encoding.UTF8.GetBytes(command).Length, command);
Add(cmd);
}
//private void WriteHeader(int bodyLen)
//{
// Send("$" + bodyLen + "\r\n");
//}
public void AddKey(string key)
{
string cmd = string.Format("${0}\r\n{1}\r\n", Encoding.UTF8.GetBytes(key).Length, key);
Add(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);
//}
/// <summary>
///
/// </summary>
/// <param name="data1"></param>
/// <param name="data2"></param>
public void AddValue(byte[] dataType, byte[] dataValue)
{
int len = dataType.Length;
if (dataValue != null)
{
len += dataValue.Length;
}
List<byte> bytes = new List<byte>();
bytes.AddRange(Encoding.UTF8.GetBytes(string.Format("${0}\r\n", len)));
bytes.AddRange(dataType);
if (dataValue != null)
{
bytes.AddRange(dataValue);
}
bytes.AddRange(Encoding.UTF8.GetBytes("\r\n"));
Add(bytes.ToArray());
//WriteHeader(len);
//Send(data1);
//if (data2 != null)
//{
// Send(data2);
//}
//Send("\r\n");
}
public void Reset(int commandCount, string command)
{
string cmd = string.Format("*{0}\r\n${1}\r\n{2}\r\n", commandCount, Encoding.UTF8.GetBytes(command).Length, command);
Add(cmd);
//Write(string.Format("*{0}\r\n", commandCount));
//WriteKey(command);
}
#region Socket
private void Add(string cmd)
{
Add(Encoding.UTF8.GetBytes(cmd));
}
private void Add(byte[] cmd)
{
command.AddRange(cmd);
//socket.Write(cmd);
}
#endregion
public void Send()
{
if (command.Count > 0)
{
socket.Write(command.ToArray());
command.Clear();
}
}
public void Dispose()
{
Send();
}
}
}