#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语言操作封装的更多相关文章

  1. Go语言操作Redis

    Go语言操作Redis Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化和客 ...

  2. GO学习-(24) Go语言操作Redis

    Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...

  3. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  4. Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!   『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』   本文提纲 ...

  5. c语言实现封装、继承和多态

    1.  概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...

  6. Go语言操作MySQL数据库

    Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...

  7. Redis 以及 Python操作Redis

    Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...

  8. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  9. 简谈Java语言的封装

    简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...

随机推荐

  1. HDU5618 Jam's problem again

    CDQ分治模板题 #include<cstdio> #include<cctype> #include<algorithm> #include<cstring ...

  2. 实现Activity的滑动返回效果

    介绍 在知乎client上看到了这样的效果.左滑Activity能够返回到上一界面.非常适合单手操作. 找了非常久,最终在github上看到了SwipeBackLayout这个开源项目.地址: htt ...

  3. jsp中获取spring 管理的bean(通过config)

    WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...

  4. angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?

    1.angular 图片加载失败 情况处理 在directive中定义组件,在ng-src错误时,调用err-src app.directive('errSrc',function(){ return ...

  5. Kick the ball!(dfs)湖南省赛第十届

    Problem K: Kick the ball! Time Limit: 1 Sec  Memory Limit: 128 MB  Special Judge Submit: 109  Solved ...

  6. 第一个Hello,OS World操作系统

    来自:清泛网 - http://www.tsingfun.com/html/2015/dev_0804/hello_os_word_my_first_os.html 首先阐述下程序运行的基本原理:计算 ...

  7. sonar+Jenkins代码覆盖率检测

    最近公司在搞代码覆盖率检查,简单看了一下结合Jenkins +jacoco + sonar做了一下主要涉及到项目层面和Jenkins层面的东西: 这里只讲一下集成,不讲解sonar的安装Jenkins ...

  8. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

  9. HDU 2102 A计划 (BFS)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. 牛顿迭代法(Newton&#39;s Method)

    牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.可是,这 一方法在牛顿生前并未公开发表(讨厌的数学家们还是鼓捣出来了) 牛顿法的作用是使用迭代的方法来求解函数方程的根. 简单地说,牛顿法就 ...