基于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的可视化工具 ...
随机推荐
- Python3 ElementTree.tostring()导致标签前辍变为ns0/ns1处理
一.说明 python中我们经常借助xml.etree.ElementTree对xml进行处理,其中ElementTree.fromstring()将字符串格式化成et对象,ElementTree.t ...
- Swagger 路径过滤 -PreSerializeFilters
Swagger 默认显示所有api, 如果要做路径过滤,可以这样做. //过滤,只显示部分api app.UseSwagger(c=> { c.PreSerializeFilters.Add(( ...
- Jquery的jqzoom插件的使用(图片放大镜)
今天学习一下,图片放大镜功能,需要使用插件JQzoom 引入文件 <script type="text/javascript" src="js/jquery.min ...
- BeanUtils.copyProperties(A,B)使用注意事项
***最近项目中用到BeanUtils.copyProperties(),然后踩了一些坑,也在网上查看了很多同行的测试和总结,现在将自己的测试.整理的注意事项分享如下,希望大家一起学习进步. ***注 ...
- 文献管理软件zotero的一点使用感受作者: 杨林畅
作者是我的本科同学叶家鑫 http://www.renren.com/profile.do?id=240875124 文章写于去年12月,我做了一些排版上的修改,括号内的蓝字为我所加 ---- zot ...
- PHP7 ci框架session存文件,登录的时候session不能读取
config.php配置 $config['sess_driver'] = 'files';//以文件存储session $config['sess_cookie_name'] = 'ci_sessi ...
- linux下查看物理CPU个数、核数、逻辑CPU个数
cat /proc/cpuinfo中的信息 processor 逻辑处理器的id.physical id 物理封装的处理器的id.core id 每个核心的id.cpu cores 位于相同物理封装的 ...
- Saiku通过iframe嵌入web页面(六)
Saiku通过iframe嵌入系统页面 前提: Saiku已安装好,并且配置了数据源,熟练了saiku的基本使用. 一.将整个Saiku嵌入页面 在web项目中,新建index.jsp页面,内容如下: ...
- 1043 输出PATest
给定一个长度不超过 104 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种 ...
- 利用include动作实现参数传递
<%--程序string.jsp--%> <%@ page language="java" import="java.util.*" page ...