选择Redis作为NoSql数据库的几点考虑:
- 数据全部存储至内存中,相对操作数据库(写磁盘)而言读写速度快且支持并发量高
- 支持持久化,AOF&RDB持久化机制可以避免由一些不可控因素导致的数据丢失问题(如:断电)
- 二进制安全,可支持存储二进制数据(如:自定义的数据包结构体和图片等信息)
- 支持数据类型多样,字符串、列表、集合、有序集合等对象可完全满足业务系统的数据存储要求
- Redis3.0开始支持分布式集群,不用再使用twemproxy+redis组合来实现集群,安装配置简单,功能强大。
Redis中重要宏定义及结构体介绍:
- struct redisContext结构体
/* redisConnect()函数返回结构体,代表该Redis的连接句柄 */
typedef struct redisContext {
int err; /* Error flags, 0 when there is no error */
char errstr[128]; /* String representation of error */
int fd;
int flags;
char *obuf; /* Write buffer */
redisReader *reader; /* Protocol reader */
} redisContext;
- struct redisReply结构体
/* redisCommand()函数返回结构体,代表该Redis命令操作的返回结果,通过type成员变量处理此结构体*/
typedef struct redisReply {
int type;
long long integer;
int len;
char *str;
size_t elements;
struct redisReply **element;
} redisReply;
redisReply结构体处理方式如下截图:
- struct redisReply::type 成员变量值宏定义:
#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3
#define REDIS_REPLY_NIL 4
#define REDIS_REPLY_STATUS 5
#define REDIS_REPLY_ERROR 6
hiredis接口中重要函数及功能介绍:
- redisConnect 连接redis
- redisConnectWithTimeout 连接redis,自定义超时时间
- redisCommand redis命令执行函数
- redisFree 释放连接redis资源(redisContext *)
- freeReplyObject 释放redis执行函数返回的资源(redisReply *)
Talk is cheap, show me the code !!!
linkRedis.h
#ifndef __LINK_REDIS__
#define __LINK_REDIS__
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <hiredis.h>
using namespace std;
/*连接redis必须要的信息*/
struct LinkRedisInfo
{
string ip;
unsigned short port;
unsigned int timeOut; //超时时间
LinkRedisInfo(string ip_, unsigned short port_, unsigned int timeOut_):ip(ip_),\
port(port_),timeOut(timeOut_){}
};
class LinkRedis
{
private:
typedef map<string, pair<LinkRedisInfo *, redisContext *> > mp_redis;
typedef map<