基于hiredis,redis C客户端封装
项目中需要用到redis就封装了一下,基于hiredis,只封装了string和哈希的部分方法。编译时加入-D__USER_LOCK__添加线程安全。
suntelRedisCli.h
#ifndef __SUNTELREDISCLI_H__
#define __SUNTELREDISCLI_H__
#include <hiredis/hiredis.h>
#ifdef __USE_LOCK__
#include <pthread.h>
#endif
#define REDIS_OK 0
#define REDIS_ERROR 0xFFFFFFFF
class CRedisCli
{
public:
CRedisCli();
~CRedisCli();
/*
* 连接到redis server
*/
int ConnectDB(const char *hostName,const int port);
int ConnectDB();
int Auth(const char *password);
/*
* 系统管理
*/
int SelectDB(int no);
int FlushDB();
int FlushAll();
/*
* string类
*/
int Set(const char *key,const char *format,...);
int Get(const char *key,char *value);
int Del(const char *key);
/*
* 哈希类
*/
int HMSet(const char *key,const char *format,...);
int HMGet(const char *key,size_t *elements,char **element);//返回element
int HSetField(const char *key,const char *field,const char *format,...);
int HGetField(const char *key,const char *field,char *value);
int HDel(const char *key);
private:
#ifdef __USE_LOCK__
pthread_mutex_t m_mutex;
#endif
redisContext* m_context;
redisReply* m_reply;
char m_redisHost[32];
int m_redisPort;
char m_redisPswd[32];
};
#endif
suntelRedisCli.cpp
#include <string.h>
#include <stdio.h>
#include "suntelRedisCli.h"
CRedisCli::CRedisCli()
{
m_context = NULL;
m_reply = NULL;
strcpy(m_redisHost,"127.0.0.1");
m_redisPort = 6379;
memset(m_redisPswd,0x00,sizeof(m_redisPswd));
#ifdef __USE_LOCK__
pthread_mutex_init(&m_mutex, NULL);
#endif
}
CRedisCli::~CRedisCli()
{
if(m_context)
redisFree(m_context);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_destroy(&m_mutex);
#endif
}
int CRedisCli::ConnectDB(const char *hostName,const int port)
{
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
strncpy(m_redisHost,hostName,sizeof(m_redisHost)-1);
m_redisPort = port;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ConnectDB();
}
int CRedisCli::ConnectDB()
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_context = redisConnect(m_redisHost,m_redisPort);
if(m_context == NULL || m_context->err)
{
if(m_context){
fprintf(stderr,"Connection error: %s\n",m_context->errstr);
redisFree(m_context);
m_context = NULL;
}
else{
fprintf(stderr,"Connection error: can't allocate redis context\n");
}
ret = REDIS_ERROR;
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::Auth(const char *password)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
strncpy(m_redisPswd,password,sizeof(m_redisPswd)-1);
m_reply = (redisReply *)redisCommand(m_context,"auth %s",m_redisPswd);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::SelectDB(int no)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"select %d",no);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::FlushDB()
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"flushdb");
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::FlushAll()
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"flushall");
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::Set(const char *key,const char *format,...)
{
va_list ap;
va_start(ap,format);
char buf[512]={0x00};
snprintf(buf,512,"SET %s %s",key,format);
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisvCommand(m_context,buf,ap);
va_end(ap);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::Get(const char *key,char * value)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"GET %s",key);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
if(m_reply->type == REDIS_REPLY_STRING)
{
strncpy(value,m_reply->str,m_reply->len);
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::Del(const char *key)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"DEL %s",key);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::HMSet(const char *key,const char *format,...)
{
va_list ap;
va_start(ap,format);
char buf[512]={0x00};
snprintf(buf,512,"HMSet %s %s",key,format);
// printf("%s\n",buf);
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisvCommand(m_context,buf,ap);
va_end(ap);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::HMGet(const char *key,size_t *elements,char **element)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"HGETALL %s",key);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
if(m_reply->type == REDIS_REPLY_ARRAY)
{
int i = 0;
for(i=0;i<m_reply->elements;i++)
{
strncpy(element[i],m_reply->element[i]->str,m_reply->element[i]->len);
}
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::HSetField(const char *key,const char *field,const char *format,...)
{
va_list ap;
va_start(ap,format);
char buf[512]={0x00};
snprintf(buf,512,"HSet %s %s %s",key,field,format);
//printf("%s\n",buf);
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisvCommand(m_context,buf,ap);
va_end(ap);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::HGetField(const char *key,const char *field,char *value)
{
int ret = REDIS_OK;
#ifdef __USE_LOCK__
pthread_mutex_lock(&m_mutex);
#endif
m_reply = (redisReply *)redisCommand(m_context,"HGET %s %s",key,field);
if( m_reply == NULL || m_reply->type == REDIS_REPLY_ERROR)
{
if(m_reply)
{
fprintf(stderr,"redis error: %s\n",m_reply->str);
freeReplyObject(m_reply);
m_reply = NULL;
}
else
{
fprintf(stderr,"redis error with null m_reply");
}
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return REDIS_ERROR;
}
if(m_reply->type == REDIS_REPLY_STRING)
{
strncpy(value,m_reply->str,m_reply->len);
}
freeReplyObject(m_reply);
m_reply = NULL;
#ifdef __USE_LOCK__
pthread_mutex_unlock(&m_mutex);
#endif
return ret;
}
int CRedisCli::HDel(const char *key)
{
return Del(key);
}
``
编译:
g++ -shared --fIPC suntelRedisCli.cpp -o lsuntelRedisCli -lhiredis
g++ -shared --fIPC suntelRedisCli.cpp -o lsuntelRedisCli -lhiredis -D__USE_LOCK__
基于hiredis,redis C客户端封装的更多相关文章
- redis web 客户端工具 redis-admin
redis-admin是基于java的redis web客户端(redis client),以方便广大程序员使用redis为宗旨,集五种数据结构增删改查于一身. https://github.com/ ...
- Redis C客户端API - God's blog - 博客频道 - CSDN.NET
Redis C客户端API - God's blog - 博客频道 - CSDN.NET Redis安装步骤: 1.redis server安装 wget http://redis.googlecod ...
- 基于表单数据的封装,泛型,反射以及使用BeanUtils进行处理
在Java Web开发过程中,会遇到很多的表单数据的提交和对表单数据的处理.而每次都需要对这些数据的字段进行一个一个的处理就显得尤为繁琐,在Java语言中,面向对象的存在目的便是为了消除重复代码,减少 ...
- Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...
- 【原创】自己动手写一个能操作redis的客户端
引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...
- 基于开源SuperSocket实现客户端和服务端通信项目实战
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
适用于app.config与web.config的ConfigUtil读写工具类 之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...
- 自荐RedisViewer有情怀的跨平台Redis可视化客户端工具
# **自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer**[转载自 最美分享Coder 2019-09-17 06:31:00](https://www.toutiao.c ...
- 自荐RedisViewer一个有情怀的跨平台Redis可视化客户端工具
自荐一个有情怀的跨平台Redis可视化客户端工具--RedisViewer 转载自 最美分享Coder 2019-09-17 06:31:00 介绍 在以往的文章中曾经介绍过几款Redis的可视化工具 ...
随机推荐
- Angular4.x 引入第三方 JS
引入 Jquery 使用 angular-cli 新建 angular项目 1.安装 jquery npm install jquery --save 2..angular-cli.json 中引入 ...
- InnoDB行记录格式(compact)、InnoDB数据页结构
1. compact 行记录格式: 变长字段长度列表,null标志位,记录头信息,列1数据,列2数据 …… 记录头信息中包含许多信息,只列举一部分: 名称 大小 描述 deleted_flag 1bi ...
- VSS迁移详细教程
本文默认迁移机和目标机已是安装好VSS服务,如果没装好参见VSS+SourceAnywhere for VSS搭建版本控制系统教程 如果你只想以最快的速度迁移库而并不关心VSS的一些操作使用,那么可直 ...
- 使用Spring-data-jpa(1)(三十)
在实际开发过程中,对数据库的操作无非就“增删改查”.就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句 ...
- Table展开行
在element-ui的官网例子中,有展开行的功能,但是只能点击某行的箭头位置,才可以展开当行的内容.这不能满足业务需求,我们老大需要点击该行的任何一个位置都能展开这行内容显示.上网找了好多例子,都能 ...
- ubuntu默认启动方式修改 psensor命令
Check UUID sudo blkid Then sudo gedit /etc/default/grub & to pull up the boot loader configurati ...
- linux磁盘管理 文件挂载
文件挂载的概念 根文件系统之外的其他文件要想能够被访问,都必须通过"关联"到根文件系统上的某个系统来实现,此关联操作即为"挂载",此目录即为"挂载点& ...
- learning ddr Electrical Characteristics and AC Timing
reference: JEDS79-3F.pdf , page:181
- export及export default
const a=2; const b=3; const c=function(){console.log(a+b} export a; export b; export default c; 如上文件 ...
- react与vue的对比
模板: Vue Vue应用的默认选项是把markup放在HTML文件中. 数据绑定表达式采用的是和Angular相似的mustache语法,而指令(特殊的HTML属性)用来向模板添加功能. React ...