hiredis库的简单包装及使用

hiredis库的简单包装及使用

GitHub下载代码

简单的包装了一下,避免忘记释放对象,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;
    }
    
posted @ 2021-06-10 15:17  做个奇怪的人  阅读(141)  评论(0编辑  收藏  举报