Redis C语言操作封装
#ifndef BOYAA_FOURLANDLORD_REDISCLASS_H_20130217
#define BOYAA_FOURLANDLORD_REDISCLASS_H_20130217
#include "hiredis.h"
#include <string>
#include <vector>
using namespace std;
typedef struct RedisConf
{
char pszServer[32];
int nPort;
RedisConf()
{
memset(this, 0, sizeof(RedisConf));
}
}TRedisConf;
class CRedisClass
{
public:
CRedisClass(string& host, int& port, unsigned short second = 5);
~CRedisClass();
int ConnectRedis(const char* host, const unsigned short& port, const unsigned short second = 5);
int ConnectRedis();
int SetValue(const string &key, const string &value);
string &GetValue(const string &key, string &value);
bool DelValue(string &key);
bool ExiKey( string &key);
int Enqueue(const string &queue, const string &value);
string &Dequeue(const string &queue, string &value);
int Push(const string &stack, const string &value);
string &Pop(const string &stack, string &value);
bool IsActived();
bool Expire(const string& key, unsigned int sec);
bool ZRange(string& key, int start, int end, vector<string> & ret);
int ZSize(const string& key);
int ZAdd(const string& key, const int value, const string& menber);
bool ZRemRangeByRank(const string& key, int min, int max);
string ZScore(const string& key, const string& member, string& score);
int ZRank(const string& key, const string& member);
int ZRevRank(const string& key, const string& member);
bool SetByte(const string & key, char * buf, int len);
int GetByte(const string & key, char * buf, int len);
bool SAdd(const string & key, const string & menber);
bool SRem(const string & key, const string & menber);
bool SMembers(const string & key, vector<string> & ret);
bool LPush(const string & key, const string & menber);
bool RPush(const string & key, const string & menber);
bool LPop(const string & key, string & value);
bool RPop(const string & key, string & value);
bool RRange(const string & key, vector<string> & ret);
bool LRem(const string & key, const string & menber);
int LLen(const string & key);
private:
TRedisConf m_RedisConf; //redis配置
redisContext *m_Redis;
redisReply *m_Reply;
struct timeval timeout;
string redisHost;
unsigned short redisPort;
void freeReply();
bool ping();
CRedisClass(const CRedisClass& /*rhs*/){}
};
#endif
#include "RedisClass.h"
#include <string>
using namespace std;
CRedisClass::CRedisClass(string& host, int& port,unsigned short second/* = 5*/)
{
m_Reply = NULL;
redisHost = host;
redisPort = port;
timeout.tv_sec = second;
timeout.tv_usec = 0;
m_Redis = redisConnectWithTimeout(redisHost.c_str(), redisPort, timeout);
}
CRedisClass::~CRedisClass()
{
if(m_Reply)
{
freeReply();
}
if(m_Redis)
{
redisFree(m_Redis);
}
}
int CRedisClass::ConnectRedis(const char* host, const unsigned short& port, const unsigned short second/* = 5*/)
{
if (m_Redis)
{
redisFree(m_Redis);
}
struct timeval tv = {second, 0};
m_Redis = redisConnectWithTimeout(host, port, tv);
return m_Redis ? 0 : 1;
}
int CRedisClass::ConnectRedis()
{
if (m_Redis)
{
redisFree(m_Redis);
}
m_Redis = redisConnectWithTimeout(redisHost.c_str(), redisPort, timeout);
return m_Redis ? 0 : 1;
}
int CRedisClass::SetValue(const string& key, const string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SET %s %s", key.c_str(), value.c_str()));
int result = 1;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 1;
}
freeReply();
return result;
}
string& CRedisClass::GetValue(const string& key, string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "GET %s", key.c_str()));
if(m_Reply != NULL && NULL != m_Reply->str)
{
value = m_Reply->str;
}
freeReply();
return value;
}
int CRedisClass::Enqueue(const string& queue, const string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpush %s %s", queue.c_str(), value.c_str()));
int result = 1;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 1;
}
freeReply();
return result;
}
string& CRedisClass::Dequeue(const string& queue, string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "lpop %s", queue.c_str()));
if (m_Reply)
{
if (m_Reply->type == 1)
{
value = m_Reply->str;
}
freeReply();
}
return value;
}
int CRedisClass::Push(const string& stack, const string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpush %s %s", stack.c_str(), value.c_str()));
int result = 1;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 1;
}
freeReply();
return result;
}
string& CRedisClass::Pop(const string& stack, string& value)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpop %s", stack.c_str()));
if(m_Reply != NULL)
{
value = m_Reply->str;
}
freeReply();
return value;
}
bool CRedisClass::DelValue(string& key)
{
m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "DEL %s ", key.c_str()));
if(m_Reply != NULL)
{
freeReply();
return true;
}
return false;
}
bool CRedisClass::ExiKey(string& key)
{
int rec = 0;
m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "EXISTS %s", key.c_str()));
if(m_Reply != NULL)
{
rec = m_Reply->integer;
freeReply();
return rec==1 ? true : false;
}
return false;
}
bool CRedisClass::IsActived()
{
return ping();
}
void CRedisClass::freeReply()
{
if(m_Reply)
{
freeReplyObject(m_Reply);
m_Reply = NULL;
}
}
bool CRedisClass::ping()
{
if (!m_Redis)
{
return false;
}
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ping"));
bool IsActviced = false;
if (m_Reply != NULL)
{
IsActviced = strcmp("PONG", m_Reply->str) == 0 ? true : false;
freeReply();
}
return IsActviced;
}
bool CRedisClass::ZRange(string& key, int start, int end, vector<string> & ret)
{
m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANGE %s %d %d",
key.c_str(), start, end));
if(m_Reply != NULL)
{
for (int i = 0; i < m_Reply->elements; i++)
{
redisReply *r = m_Reply->element[i];
ret.push_back(r->str);
}
freeReply();
return true;
}
return false;
}
int CRedisClass::ZSize(const string& key)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZCARD %s", key.c_str()));
int result = 0;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 0;
freeReply();
}
return result;
}
int CRedisClass::ZAdd(const string& key, const int value, const string& menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZADD %s %d %s", key.c_str(), value, menber.c_str()));
int result = 1;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 1;
freeReply();
}
return result;
}
bool CRedisClass::ZRemRangeByRank(const string& key, int min, int max)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREMRANGEBYRANK %s %d %d", key.c_str(), min, max));
int result = 1;
if(m_Reply != NULL)
{
result = m_Reply ? m_Reply->integer : 1;
freeReply();
}
return result;
}
string CRedisClass::ZScore(const string& key, const string& member, string& score)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZSCORE %s %s", key.c_str(), member.c_str()));
if(m_Reply != NULL)
{
if (NULL != m_Reply->str)
{
score = m_Reply->str;
}
freeReply();
}
return score;
}
int CRedisClass::ZRank(const string& key, const string& member)
{
int ret = 1000000;
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANK %s %s", key.c_str(), member.c_str()));
if(m_Reply != NULL && 3 == m_Reply->type)
{
ret = m_Reply->integer;
freeReply();
}
return ret;
}
int CRedisClass::ZRevRank(const string& key, const string& member)
{
int ret = 1000000;
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANK %s %s", key.c_str(), member.c_str()));
if(m_Reply != NULL && 3 == m_Reply->type)
{
ret = m_Reply->integer;
freeReply();
}
return ret;
}
bool CRedisClass::Expire(const string& key, unsigned int sec)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "EXPIRE %s %d", key.c_str(), sec));
bool result = false;
if(m_Reply != NULL)
{
result = true;
freeReply();
}
return result;
}
bool CRedisClass::SetByte(const string & key, char * buf, int len)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SET %b %b", key.c_str(), key.length(), buf, len));
int result = false;
if(m_Reply != NULL)
{
result = true;
freeReply();
}
return result;
}
int CRedisClass::GetByte(const string & key, char * buf, int len)
{
if (NULL != buf)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "GET %s", key.c_str()));
if (NULL != m_Reply && len >= m_Reply->len)
{
memcpy(buf, m_Reply->str, m_Reply->len);
int iRet = m_Reply->len;
freeReply();
return iRet;
}
}
return 0;
}
bool CRedisClass::SAdd(const string & key, const string & menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SADD %s %s", key.c_str(), menber.c_str()));
bool result = false;
if(m_Reply != NULL)
{
if (1 == m_Reply->integer)
{
result = true;
}
freeReply();
}
return result;
}
bool CRedisClass::SRem(const string & key, const string & menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SREM %s %s", key.c_str(), menber.c_str()));
bool result = false;
if(m_Reply != NULL)
{
if (1 == m_Reply->integer)
{
result = true;
}
freeReply();
}
return result;
}
bool CRedisClass::SMembers(const string & key, vector<string> & ret)
{
m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "SMEMBERS %s", key.c_str()));
if(m_Reply != NULL)
{
for (int i = 0; i < m_Reply->elements; i++)
{
redisReply *r = m_Reply->element[i];
ret.push_back(r->str);
}
freeReply();
return true;
}
return false;
}
bool CRedisClass::LPush(const string & key, const string & menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LPUSH %s %s", key.c_str(), menber.c_str()));
bool result = false;
if(m_Reply != NULL)
{
if (0 < m_Reply->integer)
{
result = true;
}
freeReply();
}
return result;
}
bool CRedisClass::RPush(const string & key, const string & menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "RPUSH %s %s", key.c_str(), menber.c_str()));
bool result = false;
if(m_Reply != NULL)
{
if (0 < m_Reply->integer)
{
result = true;
}
freeReply();
}
return result;
}
bool CRedisClass::LPop(const string & key, string & value)
{
value = "";
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LPOP %s", key.c_str()));
if(m_Reply != NULL && NULL != m_Reply->str)
{
value = m_Reply->str;
}
freeReply();
if (value.empty())
{
return false;
}
return true;
}
bool CRedisClass::RPop(const string & key, string & value)
{
value = "";
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "RPOP %s", key.c_str()));
if(m_Reply != NULL && NULL != m_Reply->str)
{
value = m_Reply->str;
}
freeReply();
if (value.empty())
{
return false;
}
return true;
}
bool CRedisClass::RRange(const string & key, vector<string> & ret)
{
string value;
while (RPop(key, value))
{
ret.push_back(value);
}
return true;
}
bool CRedisClass::LRem(const string & key, const string & menber)
{
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LREM %s %s", key.c_str(), menber.c_str()));
bool result = false;
if(m_Reply != NULL)
{
if (1 == m_Reply->integer)
{
result = true;
}
freeReply();
}
return result;
}
int CRedisClass::LLen(const string & key)
{
int ret = 0;
m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LLEN %s", key.c_str()));
bool result = false;
if(m_Reply != NULL)
{
ret = m_Reply->integer;
freeReply();
}
return ret;
}
Redis C语言操作封装的更多相关文章
- Go语言操作Redis
Go语言操作Redis Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化和客 ...
- GO学习-(24) Go语言操作Redis
Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- Spring Boot 整合 Redis 实现缓存操作
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』 本文提纲 ...
- c语言实现封装、继承和多态
1. 概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...
- Go语言操作MySQL数据库
Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...
- Redis 以及 Python操作Redis
Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...
- Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置
Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
随机推荐
- CF768
Codeforces Round #406 (Div. 1) A.Berzerk 考虑先手必胜态,一定是先手移动到某一个位置以后,这个位置是后手的必败态 考虑先手必败态,一定是无论先手如何移动,先手所 ...
- [simple-orm-mybaits]基于Mybatis的ORM封装介绍
目录 前言 ORM框架现状 Mybatis优缺点 simple-orm-mybatis设计思路介绍 simple-orm-mybatis使用说明 simple-orm-mybatis实际使用 推荐最佳 ...
- Java RSA 加密 解密 签名 验签
原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...
- Web文件的ContentType类型大全
".*"="application/octet-stream"".001"="application/x-001"&qu ...
- Push flow
自动移库规则push flow可以用来规划物流 比如产品A如果进入到picking区,按照仓储的规则,系统可以自动生产调拨单,将产品A 从picking区调拨到保存的库位货架A1E1 设置步骤 ...
- Balanced Binary Tree——数是否是平衡,即任意节点左右字数高度差不超过1
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- Android实战简易教程-第二十三枪(基于Baas的用户注冊和登录模块实现!)
接着上两篇文章.我们基于Bmob提供的API实现用户登录功能.总体看一下代码. 1.注冊页面xml: <RelativeLayout xmlns:android="http://sch ...
- Canvas学习笔记——动画中的三角学
示例1,跟随鼠标的键头: 需要掌握一个重要的公式,这个方法返回从 x 轴到点 (x,y) 之间的角度 Math.atan2(dy,dx); 关键代码: function Arrow() { thi ...
- 零基础学python-2.18 异常
这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...
- 更改UISearchBar button属性
//点击搜索框时触发 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { self.theSearchUserSearchBa ...