hiredis库的简单包装及使用
hiredis库的简单包装及使用
简单的包装了一下,避免忘记释放对象,main.c已注释版本是官方示例代码
-
myredis.h
/* * 文件介绍: * 创建时间: * 作者:beweirdo * 博客:https://www.cnblogs.com/beweirdo/ */ #pragma once #include "hiredis.h" using namespace std; namespace myredis { const char* rPass(const char* password) { const char* c = password; char pw[64]; int sum = 0; memset(pw, 0, sizeof(pw)); while (*c != '\0') { if (*c == '%') pw[sum++] = *c; pw[sum++] = *c; c++; if (sum >= 64)break; } return pw; }; class redis { public: /// <summary> /// 构建redis连接器 /// </summary> /// <param name="host">默认127.0.0.1</param> /// <param name="port">默认6379</param> /// <param name="seconds">默认1.5秒 flat只取一位小数 </param> redis(const char* host="127.0.0.1", int port= 6379, float seconds=1.5f ) { long usec = seconds * 10; struct timeval timeout = { (long)seconds, (usec % 10) * 100000 }; // 1.5 seconds _context = redisConnectWithTimeout(host, port, timeout); if (_context == NULL || _context->err) { if (_context) { printf("Connection error: %s\n", _context->errstr); redisFree(_context); } else { printf("Connection error: can't allocate redis context\n"); } return; } _Initflag = true; redisReply _replay = rCommand("PING"); if (_replay.str) {//如果运行正常会返回 PONG printf("PING: %s\n", _replay.str); } else { printf("error redis rCommand\n"); } } ~redis() { redisFree(_context); } bool isOk() { return _Initflag; } /// <summary> /// 执行语句 /// </summary> /// <param name="cmd">命令语句</param> /// <returns>返回redisReply指针</returns> template<typename ...Ts> redisReply rCommand(Ts&&... agv) { redisReply ret; redisReply* replay = (redisReply*)redisCommand(_context, agv ...); memcpy(&ret, replay, sizeof(redisReply)); freeReplyObject(replay); return ret; } /// <summary> /// 执行语句 /// </summary> /// <param name="cmd">执行语句</param> /// <returns>返回执行消息</returns> template<typename ...Ts> string rCmd(Ts&&... agv) { redisReply _replay = rCommand(forward<Ts&&>(agv)...); if (_replay.str) return _replay.str; return ""; } private: redisContext* _context = nullptr; bool _Initflag = false; }; };
-
main.c
/* * 文件介绍: * 创建时间: * 作者:beweirdo * 博客:https://www.cnblogs.com/beweirdo/ */ #include <windows.h> #include <iostream> #include "myredis.h" using namespace myredis; int main() { //unsigned int j, isunix = 0; //redisContext* c; //redisReply* reply; //const char* hostname = "127.0.0.1"; //int port = 8388; //struct timeval timeout = { 1, 500000 }; // 1.5 seconds //if (isunix) { // c = redisConnectUnixWithTimeout(hostname, timeout); //} //else { // c = redisConnectWithTimeout(hostname, port, timeout); //} //if (c == NULL || c->err) { // if (c) { // printf("Connection error: %s\n", c->errstr); // redisFree(c); // } // else { // printf("Connection error: can't allocate redis context\n"); // } //} ///* PING server */ //reply = (redisReply*)redisCommand(c, "PING"); //printf("PING: %s\n", reply->str); //freeReplyObject(reply); //reply = (redisReply*)redisCommand(c, "auth redis!%%^)("); //printf("errstr: %s\n", c->errstr); //freeReplyObject(reply); ///* Set a key */ //reply = (redisReply*)redisCommand(c, "SET %s %s", "foo", "hello world"); //printf("SET: %s\n", reply->str); //freeReplyObject(reply); ///* Set a key using binary safe API */ //reply = (redisReply*)redisCommand(c, "SET %b %b", "bar", (size_t)3, "hello", (size_t)5); //printf("SET (binary API): %s\n", reply->str); //freeReplyObject(reply); ///* Try a GET and two INCR */ //reply = (redisReply*)redisCommand(c, "GET foo"); //printf("GET foo: %s\n", reply->str); //freeReplyObject(reply); //reply = (redisReply*)redisCommand(c, "INCR counter"); //printf("INCR counter: %lld\n", reply->integer); //freeReplyObject(reply); ///* again ... */ //reply = (redisReply*)redisCommand(c, "INCR counter"); //printf("INCR counter: %lld\n", reply->integer); //freeReplyObject(reply); ///* Create a list of numbers, from 0 to 9 */ //reply = (redisReply*)redisCommand(c, "DEL mylist"); //freeReplyObject(reply); //for (j = 0; j < 10; j++) { // char buf[64]; // snprintf(buf, 64, "%u", j); // reply = (redisReply*)redisCommand(c, "LPUSH mylist element-%s", buf); // freeReplyObject(reply); //} ///* Let's check what we have inside the list */ //reply = (redisReply*)redisCommand(c, "LRANGE mylist 0 -1"); //if (reply->type == REDIS_REPLY_ARRAY) { // for (j = 0; j < reply->elements; j++) { // printf("%u) %s\n", j, reply->element[j]->str); // } //} //freeReplyObject(reply); ///* Disconnects and frees the context */ //redisFree(c); redis rCli(); if (!rCli.isOk()) { LOG << "error cli"; return 0; } string ret; ret = rCli.rCmd(rPass("auth redis!%^)(")); /* Set a key */ ret = rCli.rCmd("SET %s %s", "foo", "hello world"); printf("SET:%s\n", ret.c_str()); /* Try a GET and two INCR */ ret = rCli.rCmd("GET foo"); printf("GET:%s\n", ret.c_str()); /* INCR a key */ redisReply reply = rCli.rCommand("INCR counter"); printf("INCR:%lld\n", reply.integer); /* again ... */ reply = rCli.rCommand("INCR counter"); printf("INCR:%lld\n", reply.integer); /* Create a list of numbers, from 0 to 9 */ rCli.rCmd("DEL mylist"); for (int j = 0; j < 10; j++) { char buf[64]; snprintf(buf, 64, "%u", j); rCli.rCommand("LPUSH mylist element-%s", buf); } /* Let's check what we have inside the list */ reply = rCli.rCommand("LRANGE mylist 0 -1"); if (reply.type == REDIS_REPLY_ARRAY) { for (int j = 0; j < reply.elements; j++) { printf("%u) %s\n", j, reply.element[j]->str); } } return 0; }
有的人生来是为了体验这世界的精彩,而有的人只是活着就已经用尽全力了