Win7下访问redis,用vector存储查询结果

来源:互联网 发布:吕思勉 知乎 编辑:程序博客网 时间:2024/06/16 16:23

//通过代码实现获取key-value,用vector<struct>方式存储。

//【有错误或更好的方法,请大神指点或者给资源网址,方便我学习改善,谢谢】

#include <iostream>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <hiredis.h>


extern "C"
{
#include <win32fixes.h>
}
#include <ICRSINT.H>
#include <windows.h>


using namespace std;


struct vyxyc
{
char* name;
char* value;
};


void redis()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
redisContext *c;
redisReply* r;
struct timeval timeout = { 1, 500000 }; // 1.5 seconds

//redisContext* redisConnect(const char *ip, int port)  //连接redis数据库
//redisContext* redisConnectWithTimeout(const char *ip, int port, timeval tv)  //连接redis数据库
//void *redisCommand(redisContext *c, const char *format...)  //执行redis数据库中的命令
//void freeReplyObject(void *reply)  //释放redisCommand执行后返回的的redisReply所占用的内存
//void redisFree(redisContext *c)  //释放redisConnect()所产生的连接

//c = redisConnectWithTimeout((char*)"127.0.0.1", 6379, timeout);  //connect redis ok
c = redisConnect((char*)"127.0.0.1", 6379);   //connect redis ok
if (c->err) {
printf("Connection error: %s\n", c->errstr);
redisFree(c);
exit(1);
}
else
{
printf("connect success\n");
}

//一次查询多个string类型值
/*
vector<string> vredis;
const char* cmd2 = "mget yx1 yx2 yx3";
r = (redisReply*)redisCommand(c, cmd2);
if (r->type != REDIS_REPLY_ARRAY)
{
printf("Failed %s\n", cmd2);
freeReplyObject(r);
redisFree(c);
//assert(2 == r->elements);
return;
}
for (int i = 0; i < r-> elements; i++)
{
redisReply* childReply = r->element[i];
if (childReply->type == REDIS_REPLY_STRING)
{
printf("the value is %s.\n", childReply->str);
vredis.push_back(childReply->str);  //把实时值存到容器中
}
}
freeReplyObject(r);
printf("vredis size=%d\n", vredis.size());


//for (vector<string>::iterator myiter = vredis.begin(); myiter != vredis.end(); ++myiter)
for (int i = 0; i < vredis.size();i++)
{
printf("vredis[%d]= %f\n",i,atof(vredis[i].c_str()));//将string转double型
}
*/
// 先通过keys *查询出所有变量名[下面只是测试全部是string类型的情况],然后再查出对应的value
struct vyxyc syxyc;
vector<struct vyxyc> vyxyc;
const char* cmd2 = "keys yx*";  //取keys *,个人在redis中以yx开头的存的都是string类型

r = (redisReply*)redisCommand(c, cmd2);
if (r->type != REDIS_REPLY_ARRAY)
{
printf("Failed %s\n", cmd2);
freeReplyObject(r);
redisFree(c);
//assert(2 == r->elements);
return;
}
for (int i = 0; i < r->elements; i++)
{
redisReply* childReply = r->element[i];
if (childReply->type == REDIS_REPLY_STRING)
{
printf("the value is %s.\n", childReply->str);
syxyc.name = childReply->str;   //存储key

//char* getstr = "get ";
//char* cmd3 = (char*)malloc(strlen(getstr) + strlen(childReply->str) + 1);
//strcpy(cmd3, getstr);
//strcat(cmd3, childReply->str);
//redisReply* rchild = (redisReply*)redisCommand(c, cmd3);

redisReply* rchild = (redisReply*)redisCommand(c, "get %s", childReply->str);//类似sprintf可以有多个拼接成命令
if (rchild->type != REDIS_REPLY_STRING)
{
printf("Failed get %s\n", childReply->str);
freeReplyObject(rchild);
redisFree(c);
return;
}
syxyc.value = rchild->str;  //存储key对应的value

vyxyc.push_back(syxyc);  //把实时值存到容器中
}
}


for (int i = 0; i < vyxyc.size(); i++)
{
printf("vyxyc[%d] name=%s,value=%s\n",i, vyxyc[i].name,vyxyc[i].value);
}


freeReplyObject(r);


redisFree(c);
}

int main(int argc, char *argv[])
{
redis();

system("pause");

}


//【有错误或更好的方法,请大神指点或者给资源网址,方便我学习改善,再次谢谢】