基于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的可视化工具 ...
随机推荐
- jcmd
1.jps 2.jcmd 1761[pid] PerfCounter.print 查看指定进程的性能统计信息 概述 在JDK1.7以后,新增了一个命令行工具 jcmd.他是一个多功能的工具,可以用它来 ...
- 逆袭之旅.DAY08东软实训.多态~
2018年7月4日
- 微信公众号 access_token 没有过期 却失效
最近在开发微信项目的时候 access_token 缓存到 redis里面的,明明在两个小时的有效期内 微信却提示 "errcode":40001,"errmsg& ...
- shell脚本分析二
Shell 基本运算符Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实 ...
- Java使用wait() notify()方法操作共享资源
Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...
- 关于js的对象原型继承(二)
本章讨论使用new一个构造函数来创建一个对象. 前期知识点说明: 1.prototype是函数的一个属性,每个函数都有一个prototype属性.这个属性是一个指针,指向一个对象.它是显示修改对象的原 ...
- VCL界面控件DevExpress VCL Controls发布v18.2.3|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- linux安装jdk、tomcat、maven、mysql
安装SZ rz与Gcc 首先需要tomcat的jar包,打算rz上去,发现没有安装 ./configure的时候发现缺少gcc和cc 安装解决: 再次执行成功安装了sz和rz 创建软链接然后就可以使用 ...
- Problem B: 平面上的点——Point类 (II)
Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定.现在我们封装一个“Point类”来实现平面上的点的操作. 根据“append.cc”,完成Point类的构造方 ...
- 强化学习10-Deep Q Learning-fix target
针对 Deep Q Learning 可能无法收敛的问题,这里提出了一种 fix target 的方法,就是冻结现实神经网络,延时更新参数. 这个方法的初衷是这样的: 1. 之前我们每个(批)记忆都 ...