Hiredis API简单封装

  最近一个C++项目中使用Redis作为主要存储工具,在代码中直接调用Hiredis的C API不方便。对其简单做了一下封装,主要目的是更方便的使用HGet、HMGet这样一些哈希操作,支持错误重连,当然通过封装也提高了代码的复用。

  RedisHelper.h

 1 #ifndef _REDIS_HELPER_H
 2 #define _REDIS_HELPER_H
 3
 4 #include <mutex>
 5 #include <map>
 6 #include <vector>
 7 #include <string>
 8 #include <hiredis/hiredis.h>
 9
10 #define     REDIS_IP                    "xxx.xxx.xxx.xxx"
11 #define     REDIS_PORT                  "6379"
12
13 typedef std::vector<std::string> StrVec;
14 typedef std::map<std::string, std::string> StrMap;
15
16 class RedisHelper
17 {
18 public:
19     RedisHelper(const std::string& ip_, const std::string& port_);
20     ~RedisHelper();
21
22     void Connecting();
23     StrMap HMGet(const std::string& key, const StrVec& vec);
24     ... ...
25
26 private:
27     redisContext *redis_conn;
28     std::mutex conn_mutex;
29
30     redisReply *redis_reply;
31     std::mutex reply_mutex;
32
33     std::string ip;
34     int port;
35 };
36
37 inline RedisHelper& GetRedisHelper()
38 {
39     static RedisHelper helper(REDIS_IP, REDIS_PORT);
40     return helper;
41 }
42
43 #endif

  RedisHelper.cpp

 1 #include "RedisHelper.h"
 2 #include <cstdlib>
 3 #include <sstream>
 4
 5
 6 RedisHelper::RedisHelper(const std::string& ip_, const std::string& port_)
 7     : redis_conn(NULL), redis_reply(NULL), ip(ip_)
 8 {
 9     port = std::atoi(port_.c_str());
10     Connecting();
11 }
12
13 RedisHelper::~RedisHelper()
14 {
15     if(redis_conn) {
16         redisFree(redis_conn);
17     }
18 }
19
20 void RedisHelper::Connecting()
21 {
22     std::lock_guard<std::mutex> l(conn_mutex);
23     if(redis_conn) {
24         redisFree(redis_conn);
25     }
26     redis_conn = redisConnect(ip.c_str(), port);
27     if(redis_conn!=NULL && redis_conn->err) {
28         ... ...
29     }
30 }
31
32 StrMap RedisHelper::HMGet(const std::string& key, const StrVec& vec)
33 {
34     StrMap map;
35     std::lock_guard<std::mutex> l(reply_mutex);
36     size_t vecSize = vec.size();
37     if(vecSize == 0) return map;
38
39     std::stringstream sm;
40     sm << "HMGET " << key;
41     for(size_t i=0; i<vecSize; i++) {
42         sm << " " << vec[i];
43     }
44
45     redis_reply = static_cast<redisReply*>(redisCommand(redis_conn, sm.str().c_str() ));
46
47     if (redis_reply->type == REDIS_REPLY_ARRAY) {
48         if(vecSize != redis_reply->elements) {
49             ... ...
50         }
51         else {
52             for (size_t i=0; i<redis_reply->elements; ++i) {
53                map[vec[i]] = redis_reply->element[i]->str;
54             }
55         }
56     }
57     else if (redis_reply->type == REDIS_REPLY_ERROR) {
58         Connecting();
59     }
60
61     freeReplyObject(redis_reply);
62     return map;
63 }
时间: 2024-12-15 13:56:47

Hiredis API简单封装的相关文章

Redis客户端连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

工作需要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外只提供一个接口: 2.屏蔽上层应用对连接的细节处理: 3.底层采用队列的方式保持连接池,保存连接会话: 4.重连时采用时间戳进行控制,每隔一定时间(3s)重连一次,防止频繁重试造成的不必要浪费. 先看一下Hiredis的常用数据结构与API: //hiredis/hiredis.h /* Context for a connection to Redis */ typedef struct redisContext {

MySQL的C++简单封装

/* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h 1 #ifndef MY_SQL_H 2 #define MY_SQL_H 3 4 #include <mysql.h> 5 #include <iostream> 6 #include <string> 7 #include <iomanip> 8 9 cla

activemq api的封装

今天无聊写段代码..学习一下activemq,简单封装了一下activemq 的topic api.跟jdbc很类似 主要代码: import java.io.Serializable; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; impo

nodeweibo对新浪微博接口的简单封装

一.前言 就在去年12月份,有个想法是使用node爬取微博的数据,于是简单的封装了一个nodeweibo这个库.时隔一年,没有怎么维护,中途也就将函数形式改成了配置文件.以前做的一些其他的项目也下线了,为了是更加专注前端 & node.js.偶尔看到下载量一天超过60多,持续不断的有人在用这个库,但是看下载量很少也就没有更新.但是昨天,有人pull request这个分支了,提出一些中肯的建议和有用的代码.于是就认真回顾了下nodeweibo,发布了v2.0.3这个版本. 二.什么是nodewe

JDBC的简单封装

JDBC的简单封装 使用JDBC来处理数据库的接口主要有三个,即Connection,PreparedStatement和ResultSet这三个,而对于这三个接口,还可以获取不同类型的元数据,通过这些元数据类获得一些数据库的信息. 元数据(MetaData),即定义数据的数据.打个比方,就好像我们要想搜索一首歌(歌本身是数据),而我们可以通过歌名,作者,专辑等信息来搜索,那么这些歌名,作者,专辑等等就是这首歌的元数据.因此数据库的元数据就是一些注明数据库信息的数据. ① 由Connection

redis数据库操作的C++简单封装

用c++简单封装了redis的基本操作(hiredis) 接口包括:①链接和断开连接.②设置键值对(set).③查询键值对(get).④删除键值对(del).⑤将所有键显示出来 若任何一处发生错误,返回对应的错误状态码,同时可以调用getErrorMsg()查看错误信息 所有码包括: M_REDIS_OK = 0, //执行成功 M_CONNECT_FAIL = -1, //连接redis失败 M_CONTEXT_ERROR = -2, //RedisContext返回错误 M_REPLY_ER

salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming https://resources.docs.salesforce.com/210/latest/en-us/sfdc/pdf/api_streaming.pdf 背景:工作中我们有可能会有这样相关的需求:某些数据很重要,需要实时监控是否有变化,或者某些数据在其他的平台有集成.如果有变化,不刷新页

axios简单封装

写在最前面 新手前端刚刚接触vue,感觉真的好用.项目中需要使用axios,然后学习了一下.借鉴网上一些大佬的经验,现在分享一下axios的简单封装,如果有什么错误的地方,请大家指出. axios安装 npm install axios --save 最最简单的使用 首先在src目录下创建axios文件夹,然后创建index.js和fetch.js两个文件. fetch.js文件代码如下: import axios from 'axios' //定义fetch函数,config为配置 expor

React Native之Fetch简单封装、获取网络状态

1.Fetch的使用 fetch的使用非常简单,只需传入请求的url fetch('https://facebook.github.io/react-native/movies.json'); 当然是否请求成功与数据的处理,我们还需处理成功与失败的回调 function getMoviesFromApiAsync() { return fetch('https://facebook.github.io/react-native/movies.json') .then((response) =>