c++怎么正确使用redis

c++怎么正确使用redis,第1张

轻量级可以用hiredis,这是一个C库,如果搞得复杂点汪纤,可能会再依赖别的库,如果是使用boost可以考虑用redisclient (这两袜敬个库我都用过,告陵慎都没出过什么问题)

官方有提供c++ redis的库,看你项目是用到什么依赖,现在自己最熟悉的就好。用起来其实还是那么几个指令,都还是差不多。https://redis.io/clients#c--

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

基础通信

定义配置类:

public class Configuration

{

public string Host { getset}

public int Port { getset}

/// <summary>

/// Socket 是否正在使用 Nagle 算法。

/// </差衫summary>

public bool NoDelaySocket { getset}

public Configuration()

{

Host = "localhost"

Port = 6379

NoDelaySocket = false

}

}

实现socket连接:

public class RedisBaseClient

{

//配置文件

private Configuration configuration

//通信socket

private Socket socket

//接收字节数组

private byte[] ReceiveBuffer = new byte[100000]

public RedisBaseClient(Configuration config)

{

configuration = config

}

public RedisBaseClient()

: this(new Configuration())

{

}

public void Connect()

{

if (socket != null &&socket.Connected)

return

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

{

NoDelay = configuration.NoDelaySocket

}

socket.Connect(configuration.Host, configuration.Port)

if (socket.Connected)

return

Close()

}

/// <summary>

/// 关闭client

/// </summary>

public void Close()

{

socket.Disconnect(false)

socket.Close()

}

}

调用:

RedisBaseClient redis = new RedisBaseClient()

redis.Connect()

服务端成功响应:

状态命令

定义Redis命令枚举:

public enum RedisCommand

{

GET, //获取一个key的值

INFO, //Redis信息。

SET, //添加一个值

EXPIRE, //设置过期时间

MULTI, //标记一个事务块开始

EXEC, //执行所有 MULTI 之后发的命令

}

发送命令构建:

public string SendCommand(RedisCommand command, params string[] args)

{

//请求头部格式, *<number of arguments>\r\n

const string headstr = "*{0}\r\n"

//参数信息 $<number of bytes of argument N>\r\n<argument data>\r\n

const string bulkstr = "${0}\r\n{1}\r\n"

var sb = new StringBuilder()

sb.AppendFormat(headstr, args.Length + 1)

var cmd = command.ToString()

sb.AppendFormat(bulkstr, cmd.Length, cmd)

foreach (var arg in args)

{

sb.AppendFormat(bulkstr, arg.Length, arg)

}

byte[] c = Encoding.UTF8.GetBytes(sb.ToString())

try

{

Connect()

socket.Send(c)

socket.Receive(ReceiveBuffer)

Close()

return ReadData()

}

catch (SocketException e)

{

Close()

}

return null

}

private string ReadData()

{

var data = Encoding.UTF8.GetString(ReceiveBuffer)

char c = data[0]

//错误消息检查。

if (c == '-') //异常处理。

throw new Exception(data)

//状态回复。

if (c == '+')

return data

return data

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12538085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存